FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour FiveDBU para 32/64 bits
Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
Re: FiveDBU para 32/64 bits
Posted: Mon Jun 04, 2012 10:49 PM

hola Antonio,

esta en tus planes, poner un menu para seleccionar el RDD a usar?

DBFNTX, DBFCDX, DBFADS, ETC.

esto para los que usamos ADS.

saludos.

Cesar Cortes Cruz

SysCtrl Software

Mexico



' Sin +- FWH es mejor "
Posts: 111
Joined: Sat Jan 30, 2010 08:35 AM
Re: FiveDBU para 32/64 bits
Posted: Tue Jun 05, 2012 06:16 AM

Hola Antonio,

Estas haciendo un gran trabajo. Actualmente estoy utilizando Ourxdbu y una cosa que le falta 茅s la relaci贸n entre ficheros. Esta en sus planes ?

Otra cosa intent茅 compilar los recursos y me faltan algunas imagenes, podrias ponerla en algun enlace ?

xRC: FiveDbu.rc(32): warning: No newline at end of file.
xRC: FiveDbu.rc(18): error: File not found: '..\bitmaps\32x32\exit.bmp'.
xRC: FiveDbu.rc(23): error: File not found: '..\bitmaps\32x32\index2.bmp'.
xRC: FiveDbu.rc(27): error: File not found: '..\bitmaps\32x32\save.bmp'.
xRC: FiveDbu.rc(28): error: File not found: '..\bitmaps\32x32\source.bmp'.
xRC: FiveDbu.rc(29): error: File not found: '..\bitmaps\32x32\view.bmp'.
xRC: FiveDbu.rc(32): error: File not found: '..\bitmaps\16x16\yes.bmp'.

Type: C >>>Couldn't build: FiveDbu.res<<<
Type: C >>>TMAKEOBJECT<<<
Type: C >>>TMAKEOBJECT:REFRESH<<<
Type: N >>> 1423<<<

Muchas gracias.
Pere

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: FiveDBU para 32/64 bits
Posted: Tue Jun 05, 2012 08:36 AM
Pere,

Aqui tienes los bitmaps:
http://min.us/mpkM9DFCR

Podemos implementarle todo lo que queramos :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: FiveDBU para 32/64 bits
Posted: Tue Jun 05, 2012 09:12 AM
C茅sar,

sysctrl2 wrote:hola Antonio,

esta en tus planes, poner un menu para seleccionar el RDD a usar?

DBFNTX, DBFCDX, DBFADS, ETC.

esto para los que usamos ADS.

saludos.


Por favor prueba a a帽adir REQUEST ADS en FiveDBU.prg y constr煤yelo, gracias :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 111
Joined: Sat Jan 30, 2010 08:35 AM
Re: FiveDBU para 32/64 bits
Posted: Tue Jun 05, 2012 09:22 AM

Hola Antonio,

No puedo descargar el archivo de imagenes, podrias subirlo al sitio de google code ?

Pues te agradeceria que pusieras en la cola de trabajo, la relaci贸n entre ficheros abiertos.

Gracias.
Pere

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: FiveDBU para 32/64 bits
Posted: Tue Jun 05, 2012 12:09 PM
Implementando la creaci贸n de 铆ndices y el constructor de expresiones:



Code (fw): Select all Collapse
#include "FiveWin.ch"
#include "xbrowse.ch"

#ifdef __XHARBOUR__
聽 聽#define hb_CurDrive() CurDrive()
#endif 聽 

#define GENBLOCK(x) 聽&( "{ || " + x + " }" )

REQUEST DBFCDX

static oWndMain, oMruDBFs, aSearches := {}

//----------------------------------------------------------------------------//

function Main( cDbfName )

聽 聽local oBar, oBmpTiled
聽 聽
聽 聽SET DATE FORMAT TO "DD/MM/YYYY"

聽 聽SetDlgGradient( { { 1, RGB( 199, 216, 237 ), RGB( 237, 242, 248 ) } } )

聽 聽DEFINE BITMAP oBmpTiled RESOURCE "background"

聽 聽DEFINE WINDOW oWndMain TITLE "FiveDBU" MDI MENU BuildMenu()

聽 聽DEFINE BUTTONBAR oBar OF oWndMain 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "New" RESOURCE "new" ACTION New()

聽 聽DEFINE BUTTON OF oBar PROMPT "Open" RESOURCE "open" ACTION Open()

聽 聽DEFINE BUTTON OF oBar PROMPT "Copy" RESOURCE "copy" ACTION Copy() GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Paste" RESOURCE "paste" ACTION Paste()

聽 聽DEFINE BUTTON OF oBar PROMPT "Prev" RESOURCE "prev" ;
聽 聽 聽 ACTION oWndMain:PrevWindow() GROUP WHEN Len( oWndMain:oWndClient:aWnd ) > 1

聽 聽DEFINE BUTTON OF oBar PROMPT "Next" RESOURCE "next" ;
聽 聽 聽 ACTION oWndMain:NextWindow() WHEN Len( oWndMain:oWndClient:aWnd ) > 1

聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWndMain:End() GROUP

聽 聽DEFINE MSGBAR PROMPT "FiveDBU 32/64 bits, (c) FiveTech Software 2012" ;
聽 聽 聽 OF oWndMain 2010 KEYBOARD DATE

聽 聽if ! Empty( cDbfName )
聽 聽 聽 Open( cDbfName )
聽 聽endif 聽 

聽 聽ACTIVATE WINDOW oWndMain MAXIMIZED ;
聽 聽 聽 VALID MsgYesNo( "Want to end ?" ) ;
聽 聽 聽 ON PAINT DrawTiled( hDC, oWndMain, oBmpTiled )
聽 聽
聽 聽oBmpTiled:End() 聽 聽 聽

return nil

//----------------------------------------------------------------------------//

function BuildMenu()

聽 聽local oMenu
聽 聽
聽 聽MENU oMenu
聽 聽 聽 MENUITEM "Files"
聽 聽 聽 MENU
聽 聽 聽 聽 聽MENUITEM "New..."
聽 聽 聽 聽 聽MENUITEM "Open..." ACTION Open()
聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 聽 聽MENUITEM "Recent files"
聽 聽 聽 聽 聽MENU
聽 聽 聽 聽 聽 聽 MRU oMruDBFs ;
聽 聽 聽 聽 聽 聽 聽 聽FILENAME ".\FiveDBU.ini" ; 聽 聽// .INI to manipulate. '\.' for local
聽 聽 聽 聽 聽 聽 聽 聽SECTION 聽"Recent DBF files" ; // The name of the INI section
聽 聽 聽 聽 聽 聽 聽 聽ACTION 聽 Open( cMruItem ) ; 聽 // cMruItem is automatically provided
聽 聽 聽 聽 聽 聽 聽 聽MESSAGE 聽"Open this file" ; 聽 // The message for all of them
聽 聽 聽 聽 聽 聽 聽 聽SIZE 聽 聽 10
聽 聽 聽 聽 聽ENDMENU 聽 聽 聽 

聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 聽 聽MENUITEM "Exit" ACTION oWndMain:End()
聽 聽 聽 ENDMENU
聽 聽 聽 
聽 聽 聽 // oMenu:AddEdit()
聽 聽 聽 oMenu:AddMdi()
聽 聽 聽 oMenu:AddHelp( "FiveDBU", "(c) FiveTech Software 2012" )
聽 聽ENDMENU
聽 聽
return oMenu 聽 聽 聽

//----------------------------------------------------------------------------//

function Open( cFileName )

聽 聽local oWnd, oBar, oBrw, oMsgBar, oMsgDeleted, oMsgTagName
聽 聽local oPopup, cAlias, n, cClrBack, nTags
聽 聽
聽 聽DEFAULT cFileName := cGetFile( "*.dbf", "Please select a DBF" )
聽 聽
聽 聽if Empty( cFileName )
聽 聽 聽 return nil
聽 聽endif 聽 
聽 聽
聽 聽if ! "." $ cFileName
聽 聽 聽 cFileName += ".dbf"
聽 聽endif 聽 
聽 聽
聽 聽if ! File( cFileName )
聽 聽 聽 MsgStop( "File not found: " + cFileName )
聽 聽 聽 return nil
聽 聽endif
聽 聽
聽 聽if File( cFileNoExt( cFileName ) + ".ntx" )
聽 聽 聽 USE ( cFileName ) VIA "DBFNTX" NEW SHARED ;
聽 聽 聽 聽 聽ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )
聽 聽else 聽 
聽 聽 聽 USE ( cFileName ) VIA "DBFCDX" NEW SHARED ;
聽 聽 聽 聽 聽ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )
聽 聽 聽 cAlias = Alias()
聽 聽endif 聽 聽 聽 聽
聽 聽
聽 聽oMruDBFs:Save( cFileName )
聽 聽
聽 聽MENU oPopup POPUP
聽 聽 聽 MENUITEM "Natural order" ;
聽 聽 聽 聽 聽ACTION ( ( cAlias )->( DbSetOrder( 0 ) ), oBrw:Refresh(), oBrw:SetFocus(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 ( cAlias )->( Eval( oBrw:bChange ) ) )
聽 聽 聽 
聽 聽 聽 if ( nTags := ( cAlias )->( OrdTagsCount() ) ) > 0
聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 endif 聽 
聽 聽 聽 
聽 聽 聽 for n = 1 to nTags
聽 聽 聽 聽 聽if ! Empty( OrdName( n ) )
聽 聽 聽 聽 聽 聽 if ! Empty( OrdName( 1 ) )
聽 聽 聽 聽 聽 聽 聽 聽DbSetOrder( OrdName( 1 ) )
聽 聽 聽 聽 聽 聽 聽 聽DbGoTop()
聽 聽 聽 聽 聽 聽 endif 聽 
聽 聽 聽 聽 聽 聽 MENUITEM OrdName( n ) ;
聽 聽 聽 聽 聽 聽 聽 聽ACTION ( ( cAlias )->( DbSetOrder( oMenuItem:cPrompt ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oBrw:Refresh(), ( cAlias )->( Eval( oBrw:bChange ) ), oBrw:SetFocus() )
聽 聽 聽 聽 聽endif
聽 聽 聽 next 聽 聽
聽 聽ENDMENU 聽 
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Browse " + cFileName MDICHILD

聽 聽oWnd:bCopy = { || MsgInfo( "copy" ) }

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
聽 聽 聽 ACTION ( ( oBrw:cAlias )->( DbAppend() ), oBrw:Refresh(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
聽 聽 聽 ACTION ( oBrw:cAlias )->( Edit() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
聽 聽 聽 ACTION ( obrw:cAlias )->( DelRecord( oBrw, oMsgDeleted ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Search" RESOURCE "search" ;
聽 聽 聽 GROUP ACTION ( cAlias )->( Search( oBrw ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Index" RESOURCE "index" ;
聽 聽 聽 MENU oPopup ACTION ( cAlias )->( Indexes() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Top" RESOURCE "top" ;
聽 聽 聽 ACTION ( oBrw:GoTop(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Bottom" RESOURCE "bottom" ;
聽 聽 聽 ACTION ( oBrw:GoBottom(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Struct" RESOURCE "struct" ;
聽 聽 聽 ACTION ( oBrw:cAlias )->( Struct() ) GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report()

聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd LINES ;
聽 聽 聽 ON CHANGE ( oMsgBar:cMsgDef := "Alias: " + Alias() + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽" RecNo: " + AllTrim( Str( RecNo() ) ) + "/" + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽AllTrim( Str( RecCount() ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgBar:Refresh(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgTagName:SetText( "Ordered by: " + If( ! Empty( OrdName() ), OrdName(), "Natural order" ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgDeleted:SetText( If( ( oBrw:cAlias )->( Deleted() ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"DELETED", "NON DELETED" ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgDeleted:SetBitmap( If( ( oBrw:cAlias )->( Deleted() ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"deleted", "nondeleted" ) ) )

聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_BLACK ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_BLACK ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_WHITE ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 0x33, 0x66, 0xCC ) } }
聽 聽cClrBack = Eval( oBrw:bClrSelFocus )[ 2 ] 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:bClrSelFocus = { || { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_WHITE ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 cClrBack } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽oBrw:bLDblClick = { || ( oBrw:cAlias )->( Edit() ) } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽
聽 聽oWnd:oClient = oBrw
聽 聽oWnd:oControl = oBrw

聽 聽DEFINE MSGBAR oMsgBar PROMPT "Alias: " + Alias() + " | RecNo: " + ;
聽 聽 聽 AllTrim( Str( RecNo() ) ) + "/" + ;
聽 聽 聽 AllTrim( Str( RecCount() ) ) ;
聽 聽 聽 OF oWnd 2010 

聽 聽DEFINE MSGITEM oMsgTagName OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT "Ordered by: " + ;
聽 聽 聽 聽 聽 If( ! Empty( ( oBrw:cAlias )->( OrdName() ) ),;
聽 聽 聽 聽 聽 聽 聽 ( oBrw:cAlias )->( OrdName() ), "Natural order" ) ;
聽 聽 聽 聽 聽 SIZE 150

聽 聽DEFINE MSGITEM oMsgDeleted OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT If( ( oBrw:cAlias )->( Deleted() ), "DELETED", "NON DELETED" ) ;
聽 聽 聽 聽 聽 SIZE 130 ;
聽 聽 聽 聽 聽 BITMAPS "nondeleted" ;
聽 聽 聽 聽 聽 ACTION ( oBrw:cAlias )->( DelRecord( oBrw, oMsgDeleted ) ) 聽 
聽 聽 聽 聽 聽 
聽 聽ACTIVATE WINDOW oWnd ;
聽 聽 聽 VALID ( ( cAlias )->( DbCloseArea() ), oBrw:cAlias := "", .T. )
聽 聽
return nil 聽 

//----------------------------------------------------------------------------//

function Copy()

聽 聽if oWndMain:oWndActive != nil
聽 聽 聽 oWndMain:oWndActive:Copy()
聽 聽endif 聽 

return nil

//----------------------------------------------------------------------------//
聽 
function DelField( aFields, cFieldName, oGet, oBrw )

聽 聽if Len( aFields ) >= 1
聽 聽 聽 ADel( aFields, oBrw:nArrayAt, .T. )
聽 聽 聽 oBrw:SetArray( aFields )
聽 聽endif

聽 聽oGet:VarPut( cFieldName := Space( 10 ) )
聽 聽oGet:SetPos( 0 )
聽 聽oGet:SetFocus()
聽 聽oBrw:GoBottom()
聽 聽 聽 聽 聽 聽 聽 聽
return nil

//----------------------------------------------------------------------------//
聽 聽 聽 聽
function DelRecord( oBrw, oMsgDeleted )

聽 聽if ! Deleted() 
聽 聽 聽 if ! MsgYesNo( "Want to delete this record ?" )
聽 聽 聽 聽 聽return nil
聽 聽 聽 endif 聽 
聽 聽 聽 DbRLock() 聽 
聽 聽 聽 DbDelete() 聽 
聽 聽 聽 DbUnlock() 聽 
聽 聽 聽 oMsgDeleted:SetText( "DELETED" )
聽 聽 聽 oMsgDeleted:SetBitmap( "deleted" )
聽 聽else
聽 聽 聽 DbRLock() 聽 
聽 聽 聽 DbRecall() 聽 
聽 聽 聽 DbUnlock() 聽 聽 聽 聽 
聽 聽 聽 oMsgDeleted:SetText( "NON DELETED" )
聽 聽 聽 oMsgDeleted:SetBitmap( "nondeleted" )
聽 聽 聽 MsgInfo( "UnDeleted record" )
聽 聽endif
聽 聽
聽 聽Eval( oBrw:bChange )
聽 聽oBrw:Refresh()

return nil 聽 

//----------------------------------------------------------------------------//
聽 聽
function Edit()

聽 聽local oWnd, aRecord := ( Alias() )->( LoadRecord() ), oBar, oBrw, oMsgBar
聽 聽local cAlias := Alias(), oBtnSave, nRecNo := ( Alias() )->( RecNo() )
聽 聽local oMsgDeleted
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Edit " + Alias() MDICHILD

聽 聽oWndMain:oBar:AEvalWhen()

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON oBtnSave OF oBar PROMPT "Save" RESOURCE "save" ;
聽 聽 聽 ACTION ( ( cAlias )->( SaveRecord( aRecord, nRecNo ) ), oBtnSave:Disable() )

聽 聽oBtnSave:Disable()

聽 聽DEFINE BUTTON OF oBar PROMPT "Prev" RESOURCE "prev" ;
聽 聽 聽 ACTION GoPrevRecord( oBrw, aRecord, oMsgDeleted ) GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Next" RESOURCE "next" ;
聽 聽 聽 ACTION GoNextRecord( oBrw, aRecord, oMsgDeleted ) 

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report() GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "View" RESOURCE "view" ;
聽 聽 聽 ACTION View( oBrw:aRow[ 2 ], oWnd )
聽 聽 聽 
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd ARRAY aRecord AUTOCOLS LINES ;
聽 聽 聽 HEADERS "FieldName", "Value" COLSIZES 150, 400 FASTEDIT ;
聽 聽 聽 ON CHANGE ( ( cAlias )->( SetEditType( oBrw, oBtnSave ) ), oBrw:DrawLine( .T. ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 oMsgBar:cMsgDef := " RecNo: " + AllTrim( Str( ( cAlias )->( RecNo() ) ) ) + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"/" + AllTrim( Str( ( cAlias )->( RecCount() ) ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 oMsgBar:Refresh() ) 聽 聽 聽 聽 聽 聽 聽 聽 

聽 聽oBrw:nEditTypes = EDIT_GET
聽 聽oBrw:aCols[ 1 ]:nEditType = 0 // Don't allow to edit first column
聽 聽oBrw:aCols[ 2 ]:bOnChange = { || oBtnSave:Enable() }
聽 聽oBrw:aCols[ 2 ]:lWillShowABtn = .T.
聽 聽oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽
聽 聽oWnd:oClient = oBrw

聽 聽DEFINE MSGBAR oMsgBar ;
聽 聽 聽 PROMPT " RecNo: " + AllTrim( Str( ( cAlias )->( RecNo() ) ) ) + "/" + ;
聽 聽 聽 AllTrim( Str( ( cAlias )->( RecCount() ) ) ) OF oWnd 2010

聽 聽DEFINE MSGITEM oMsgDeleted OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT If( ( cAlias )->( Deleted() ), "DELETED", "NON DELETED" ) ;
聽 聽 聽 聽 聽 SIZE 130 ;
聽 聽 聽 聽 聽 BITMAPS If( ( cAlias )->( Deleted() ), "deleted", "nondeleted" ) ;
聽 聽 聽 聽 聽 ACTION ( cAlias )->( DelRecord( oBrw, oMsgDeleted ) ) 聽 
聽 聽
聽 聽ACTIVATE WINDOW oWnd
聽 聽
return nil 聽 聽 聽

//----------------------------------------------------------------------------//

function GoPrevRecord( oBrw, aRecord, oMsgDeleted )

聽 聽DbSkip( -1 )
聽 聽
聽 聽oBrw:SetArray( aRecord := LoadRecord() )
聽 聽oBrw:SetFocus()
聽 聽Eval( oBrw:bChange )

聽 聽oMsgDeleted:SetText( If( Deleted(), "DELETED", "NON DELETED" ) )
聽 聽oMsgDeleted:SetBitmap( If( Deleted(), "deleted", "nondeleted" ) )
聽 聽
return nil

//----------------------------------------------------------------------------//

function GoNextRecord( oBrw, aRecord, oMsgDeleted )

聽 聽DbSkip( 1 )
聽 聽
聽 聽If Eof()
聽 聽 聽 DbSkip( -1 )
聽 聽else
聽 聽 聽 oBrw:SetArray( aRecord := LoadRecord() )
聽 聽 聽 oBrw:SetFocus()
聽 聽 聽 Eval( oBrw:bChange )
聽 聽endif 聽 

聽 聽oMsgDeleted:SetText( If( Deleted(), "DELETED", "NON DELETED" ) )
聽 聽oMsgDeleted:SetBitmap( If( Deleted(), "deleted", "nondeleted" ) )
聽 聽
return nil

//----------------------------------------------------------------------------//

function SetEditType( oBrw, oBtnSave )

聽 聽local cType := FieldType( oBrw:nArrayAt )
聽 聽
聽 聽do case
聽 聽 聽 case cType == "M"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_BUTTON
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:bEditBlock = { | c | c := oBrw:aRow[ 2 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽MemoEdit( @oBrw:aRow[ 2 ], FieldName( oBrw:nArrayAt ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( ! c == oBrw:aRow[ 2 ], oBtnSave:Enable(),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:aRow[ 2 ] }
聽 聽
聽 聽 聽 case cType == "D"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_BUTTON
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:bEditBlock = { || If( ! Empty( oBrw:aRow[ 2 ] ) .and. ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽! AllTrim( oBrw:aRow[ 2 ] ) == "/ 聽/",;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽DToC( MsgDate( CtoD( oBrw:aRow[ 2 ] ) ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽DToC( MsgDate( Date() ) ) ) }
聽 聽
聽 聽 聽 case cType == "L"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_LISTBOX
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:aEditListTxt 聽 = { ".T.", ".F." }
聽 聽 聽 聽 聽 聽
聽 聽 聽 otherwise
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_GET
聽 聽endcase
聽 聽
return nil 聽 聽 聽 聽 聽 聽 聽

//----------------------------------------------------------------------------//

function IndexBuilder()

聽 聽local oDlg, cExp := Space( 80 ), cTo := Space( 80 ), cTag := Space( 20 )
聽 聽local cFor := Space( 80 ), cWhile := Space( 80 ), lUnique := .F.
聽 聽local lDescend := .F., lMemory := .F., cScope := "All", nRecNo
聽 聽local oPgr, nMeter := 0, nStep := 10, lTag := .T. 
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Index builder" SIZE 530, 380 

聽 聽@ 0.4, 3 SAY "Expression:" OF oDlg SIZE 40, 8

聽 聽@ 0.5, 6 GET cExp OF oDlg SIZE 200, 11 ACTION ExpBuilder( @cExp ) ;
聽 聽 聽 VALID ! Empty( cExp )
聽 聽
聽 聽@ 1.5, 6 SAY "To:" OF oDlg SIZE 40, 8

聽 聽@ 1.7, 6 GET cTo OF oDlg SIZE 200, 11

聽 聽@ 2.6, 5.5 SAY "Tag:" OF oDlg SIZE 40, 8

聽 聽@ 聽 3, 6 GET cTag OF oDlg SIZE 100, 11
聽 聽
聽 聽@ 3.7, 5.9 SAY "For:" OF oDlg SIZE 40, 8

聽 聽@ 4.3, 6 GET cFor OF oDlg SIZE 200, 11 ACTION ExpBuilder()

聽 聽@ 4.8, 5 SAY "While:" OF oDlg SIZE 40, 8

聽 聽@ 5.6, 6 GET cWhile OF oDlg SIZE 200, 11 ACTION ExpBuilder()
聽 聽
聽 聽@ 6.8, 6.9 CHECKBOX lUnique PROMPT "&Unique" OF oDlg SIZE 50, 8

聽 聽@ 6.8, 13.9 CHECKBOX lDescend PROMPT "&Descending" OF oDlg SIZE 80, 8

聽 聽@ 6.8, 23 CHECKBOX lMemory PROMPT "&Memory" OF oDlg SIZE 40, 8

聽 聽@ 6.8, 8 SAY "Scope:" OF oDlg SIZE 40, 8
聽 聽
聽 聽@ 8.2, 6 COMBOBOX cScope ITEMS { "All", "Next", "Record", "Rest" } OF oDlg

聽 聽@ 6.8, 16.1 SAY "Record:" OF oDlg SIZE 40, 8

聽 聽@ 8.8, 12.1 GET nRecNo OF oDlg SIZE 30, 11

聽 聽@ 8.5, 8 SAY "Progress:" OF oDlg SIZE 40, 8
聽 聽
聽 聽@ 9.2, 8 PROGRESS oPgr OF oDlg SIZE 200, 10
聽 聽
聽 聽@ 9.2, 13 BUTTON "C&reate" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( OrdCondSet( If( ! Empty( cFor ), cFor,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( ! Empty( cFor ), GENBLOCK( cFor ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "All", .T.,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( ! Empty( cWhile ), GENBLOCK( cWhile ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ || nMeter += nStep, oPgr:SetPos( nMeter ), SysRefresh() },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nStep, Recno(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "Next", nRecNo,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "Record", nRecNo,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "Rest", .T.,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( lDescend, .T.,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽lTag,, .F., .F., .F., .T., .F., .F. ),;
聽 聽 聽 聽 聽 聽 聽 聽OrdCreate( OrdBagName(), If( lTag, cTag,), cExp, GENBLOCK( cExp ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( lUnique, .T.,) ), oDlg:End() ) 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽

聽 聽@ 9.2, 24 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End() CANCEL
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED

return nil

//----------------------------------------------------------------------------//

function Indexes()

聽 聽local oWnd, oBar, oBrw, oMsgBar
聽 聽local cAlias := Alias(), aIndexes := {}, n 
聽 聽
聽 聽for n = 1 to 15
聽 聽 聽 if ! Empty( OrdName( n ) )
聽 聽 聽 聽 聽AAdd( aIndexes, { n,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽OrdName( n ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽OrdKey( n ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽OrdFor( n ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽OrdBagName( n ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽OrdBagExt( n ) } )
聽 聽 聽 endif 聽 
聽 聽next 聽 聽
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Indexes of " + Alias() MDICHILD

聽 聽oWndMain:oBar:AEvalWhen()

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70

聽 聽DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
聽 聽 聽 ACTION ( IndexBuilder(), oBrw:Refresh(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
聽 聽 聽 ACTION ( MsgInfo( "Edit" ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
聽 聽 聽 ACTION If( MsgYesNo( "Want to delete this tag ?" ),;
聽 聽 聽 聽 聽 聽 聽 聽 ( ( cAlias )->( OrdBagClear( oBrw:nArrayAt ) ), oBrw:Refresh() ),)

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report() GROUP
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd ARRAY aIndexes AUTOCOLS LINES ;
聽 聽 聽 HEADERS "Order", "TagName", "Expression", "For", "BagName", "BagExt" ;
聽 聽 聽 COLSIZES 50, 150, 400, 400, 150, 150

聽 聽oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽
聽 聽oWnd:oClient = oBrw

聽 聽DEFINE MSGBAR oMsgBar 2010
聽 聽
聽 聽ACTIVATE WINDOW oWnd 

return nil

//----------------------------------------------------------------------------//

function ExpBuilder( cExp )

聽 聽local oDlg, oBrw, aFields := DBStruct()
聽 聽local oExp
聽 聽
聽 聽cExp = RTrim( cExp )
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Expression builder" SIZE 480, 450
聽 聽
聽 聽@ 0.2, 1.5 SAY "Expression:" SIZE 80, 11 OF oDlg
聽 聽
聽 聽@ 1.1, 1 GET oExp VAR cExp MEMO SIZE 221, 27
聽 聽
聽 聽@ 3, 1.5 SAY "Fields" OF oDlg SIZE 40, 10
聽 聽
聽 聽@ 4, 1 XBROWSE oBrw ARRAY aFields AUTOCOLS LINES SIZE 120, 120 ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 95, 30, 30, 30 
聽 聽 聽 
聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:bLDblClick = { || cExp += oBrw:aRow[ 1 ], oExp:Refresh() } 

聽 聽@ 3, 23.1 SAY "Operators" OF oDlg SIZE 40, 10

聽 聽@ 3.1, 23 BUTTON "=" OF oDlg SIZE 15, 15 ACTION ( cExp += " = ", oExp:Refresh() )

聽 聽@ 3.1, 26.2 BUTTON "<>" OF oDlg SIZE 15, 15 ACTION ( cExp += " <> ", oExp:Refresh() )

聽 聽@ 3.1, 29.4 BUTTON "+" OF oDlg SIZE 15, 15 ACTION ( cExp += " + ", oExp:Refresh() )

聽 聽@ 3.1, 32.6 BUTTON "(" OF oDlg SIZE 15, 15 ACTION ( cExp += " ( ", oExp:Refresh() )

聽 聽@ 3.1, 35.8 BUTTON ".T." OF oDlg SIZE 15, 15 ACTION ( cExp += " .T. ", oExp:Refresh() )

聽 聽@ 4.1, 23 BUTTON "<" OF oDlg SIZE 15, 15 ACTION ( cExp += " < ", oExp:Refresh() )

聽 聽@ 4.1, 26.2 BUTTON ">" OF oDlg SIZE 15, 15 ACTION ( cExp += " > ", oExp:Refresh() )

聽 聽@ 4.1, 29.4 BUTTON "-" OF oDlg SIZE 15, 15 ACTION ( cExp += " - ", oExp:Refresh() )

聽 聽@ 4.1, 32.6 BUTTON ")" OF oDlg SIZE 15, 15 ACTION ( cExp += " )", oExp:Refresh() )

聽 聽@ 4.1, 35.8 BUTTON ".F." OF oDlg SIZE 15, 15 ACTION ( cExp += " .F. ", oExp:Refresh() )

聽 聽@ 5.1, 23 BUTTON "<=" OF oDlg SIZE 15, 15 ACTION ( cExp += " <= ", oExp:Refresh() )

聽 聽@ 5.1, 26.2 BUTTON ">=" OF oDlg SIZE 15, 15 ACTION ( cExp += " >= ", oExp:Refresh() )

聽 聽@ 5.1, 29.4 BUTTON "*" OF oDlg SIZE 15, 15 ACTION ( cExp += " * ", oExp:Refresh() )

聽 聽@ 5.1, 32.6 BUTTON "/" OF oDlg SIZE 15, 15 ACTION ( cExp += " / ", oExp:Refresh() )

聽 聽@ 5.1, 35.8 BUTTON "$" OF oDlg SIZE 15, 15 ACTION ( cExp += " $ ", oExp:Refresh() )

聽 聽@ 6.1, 23 BUTTON '"' OF oDlg SIZE 15, 15 ACTION ( cExp += '"', oExp:Refresh() )

聽 聽@ 6.1, 26.2 BUTTON "!" OF oDlg SIZE 15, 15 ACTION ( cExp += " ! ", oExp:Refresh() )

聽 聽@ 6.1, 29.4 BUTTON "SP" OF oDlg SIZE 15, 15 ACTION ( cExp += " ", oExp:Refresh() )

聽 聽@ 6.1, 32.6 BUTTON "," OF oDlg SIZE 15, 15 ACTION ( cExp += ", ", oExp:Refresh() )

聽 聽@ 6.1, 35.8 BUTTON ":" OF oDlg SIZE 15, 15 ACTION ( cExp += " : ", oExp:Refresh() )

聽 聽@ 7.1, 23 BUTTON "AND" OF oDlg SIZE 27, 15 ACTION ( cExp += " .and. ", oExp:Refresh() )

聽 聽@ 7.1, 28.4 BUTTON "OR" OF oDlg SIZE 27, 15 ACTION ( cExp += " .or. ", oExp:Refresh() )

聽 聽@ 7.1, 33.7 BUTTON "NOT" OF oDlg SIZE 27, 15 ACTION ( cExp += " ! ", oExp:Refresh() )

聽 聽@ 11, 13 BUTTON "&Ok" OF oDlg SIZE 45, 13 ACTION oDlg:End()

聽 聽@ 11, 24 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End() CANCEL
聽 聽 聽 聽 聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED

return cExp

//----------------------------------------------------------------------------//

function LoadRecord()

聽 聽local aRecord := {}, n
聽 聽
聽 聽for n = 1 to FCount()
聽 聽 聽 AAdd( aRecord, { FieldName( n ), FieldGet( n ) } )
聽 聽next
聽 聽
return aRecord 聽 聽 聽
聽 聽
//----------------------------------------------------------------------------// 

function Search( oBrw )

聽 聽local oDlg, oCbx, cSearch := Space( 50 )
聽 聽local nRecNo := RecNo(), lInc := .T.
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Search: " + Alias() SIZE 400, 200
聽 聽
聽 聽@ 0.5, 1.5 SAY "Ordered by: " + OrdName() OF oDlg
聽 聽
聽 聽@ 1.2, 1.5 SAY "Key: " + OrdKey() OF oDlg
聽 聽
聽 聽@ 2.4, 1.2 COMBOBOX oCbx VAR cSearch ITEMS aSearches OF oDlg SIZE 180, 150 ;
聽 聽 聽STYLE CBS_DROPDOWN
聽 聽
聽 聽oCbx:oGet:bChange = { || DbSeek( AllTrim( oCbx:GetText() ), lInc ), oBrw:Refresh() } 
聽 聽
聽 聽@ 3.7, 1.5 CHECKBOX lInc PROMPT "&Incremental" OF oDlg SIZE 80, 10
聽 聽
聽 聽@ 4, 7 BUTTON "&Ok" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( If( ! DbSeek( AllTrim( cSearch ), lInc ), DbGoTo( nRecNo ),),;
聽 聽 聽 聽 聽 聽 聽 聽AAdd( aSearches, AllTrim( cSearch ) ), oDlg:End() )

聽 聽@ 4, 18 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End()
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED
聽 聽
return nil 聽 

//----------------------------------------------------------------------------// 

function SaveRecord( aRecord, nRecNo )

聽 聽local n

聽 聽( Alias() )->( DbGoTo( nRecNo ) )
聽 聽
聽 聽if ( Alias() )->( DbRLock( nRecNo ) )
聽 聽 聽 for n = 1 to Len( aRecord )
聽 聽 聽 聽 聽( Alias() )->( FieldPut( n, aRecord[ n ][ 2 ] ) )
聽 聽 聽 next
聽 聽 聽 ( Alias() )->( DbUnLock() )
聽 聽 聽 MsgInfo( "Record updated" )
聽 聽else
聽 聽 聽 MsgAlert( "Record in use, please try it again" )
聽 聽endif 聽 聽 聽 聽 

return nil 聽 聽 聽

//----------------------------------------------------------------------------// 

function Struct()

聽 聽local oDlg, oBrw, aFields := DbStruct()
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE Alias() + " fields" SIZE 400, 400

聽 聽@ 0, 0 XBROWSE oBrw ARRAY aFields AUTOCOLS LINES ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 150, 50, 80, 80

聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽
聽 聽oBrw:CreateFromCode()
聽 聽 聽 
聽 聽oDlg:oClient = oBrw
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED ;
聽 聽 聽 ON INIT ( BuildStructBar( oDlg, oBrw ), oDlg:Resize(), oBrw:SetFocus() )
聽 聽
return nil 聽 

//----------------------------------------------------------------------------// 

function BuildStructBar( oDlg, oBrw )

聽 聽local oBar

聽 聽DEFINE BUTTONBAR oBar OF oDlg 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Code" RESOURCE "code" ;
聽 聽 聽 ACTION ( TxtStruct(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oDlg:End() GROUP

return nil

//----------------------------------------------------------------------------// 

function TxtStruct()

聽 聽local cCode := "local aFields := { ", n
聽 聽
聽 聽for n = 1 to FCount()
聽 聽 聽 if n > 1
聽 聽 聽 聽 聽cCode += Space( 27 )
聽 聽 聽 endif 聽 
聽 聽 聽 cCode += '{ "' + FieldName( n ) + '", "' + ;
聽 聽 聽 聽 聽 聽 聽 聽FieldType( n ) + '", ' + ;
聽 聽 聽 聽 聽 聽 聽 聽AllTrim( Str( FieldLen( n ) ) ) + ", " + ;
聽 聽 聽 聽 聽 聽 聽 聽AllTrim( Str( FieldDec( n ) ) ) + " },;" + CRLF
聽 聽next
聽 聽
聽 聽cCode = SubStr( cCode, 1, Len( cCode ) - 4 ) + " }"
聽 聽
聽 聽MemoEdit( cCode, "Code" )

return nil

//----------------------------------------------------------------------------// 聽 

function View( cFileName, oWnd )

聽 聽local cExt := Lower( cFileExt( cFileName ) )
聽 聽
聽 聽do case
聽 聽 聽 case cExt == "bmp"
聽 聽 聽 聽 聽 聽WinExec( "mspaint" + " " + cFileName )
聽 聽 聽 聽 聽 聽
聽 聽 聽 case cExt == "txt"
聽 聽 聽 聽 聽 聽WinExec( "notepad" + " " + cFileName ) 聽 聽 
聽 聽 聽 聽 聽 聽
聽 聽 聽 otherwise
聽 聽 聽 聽 聽 聽ShellExecute( oWnd:hWnd, "Open", cFileName )
聽 聽endcase
聽 聽
return nil 聽 聽 聽 聽 聽 聽 聽 聽

//----------------------------------------------------------------------------// 聽 

function New()

聽 聽local oDlg, oGet, oBrw
聽 聽local cFieldName := Space( 10 ), cType := "Character", nLen := 10, nDec := 0
聽 聽local aFields := { Array( 4 ) }, cDbfName := Space( 8 ), aTemp
聽 聽local oLen, oDec
聽 聽local bChange := {|| If( cType == "Character", (nLen := 10, nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Number", 聽 聽(nLen := 10, nDec := 0, oDec:Enable() 聽),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Date", 聽 聽 聽(nLen := 8, 聽nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Logical", 聽 (nLen := 1, 聽nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Memo", 聽 聽 聽(nLen := 10, nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oDlg:Update() }

聽 聽DEFINE DIALOG oDlg TITLE "DBF builder" SIZE 415, 400

聽 聽@ 0.5, 聽2 SAY "Field Name" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 10 SAY "Type" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 17 SAY "Len" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 22 SAY "Dec" OF oDlg SIZE 20, 8

聽 聽@ 1.4, 1 GET oGet VAR cFieldName PICTURE "!!!!!!!!!!" OF oDlg SIZE 41, 11

聽 聽@ 1.3, 6.5 COMBOBOX cType ITEMS { "Character", "Number", "Date", "Logical", "Memo" } ;
聽 聽 聽 OF oDlg ON CHANGE Eval (bChange)

聽 聽@ 1.4, 11.9 GET oLen VAR nLen PICTURE "999" OF oDlg SIZE 25, 11 UPDATE

聽 聽@ 1.4, 15.4 GET oDec VAR nDec PICTURE "999" OF oDlg SIZE 25, 11 UPDATE
聽 聽
聽 聽@ 0.9, 26 BUTTON "&Add" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION AddField( @aFields, @cFieldName, @cType, @nLen, @nDec, oGet, oBrw )

聽 聽@ 2.2, 2 SAY "Fields" OF oDlg SIZE 40, 8
聽 聽
聽 聽@ 3.2, 1 XBROWSE oBrw ARRAY aFields AUTOCOLS ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 90, 55, 40, 40 ;
聽 聽 聽 SIZE 140, 130 OF oDlg

聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()

聽 聽@ 2.4, 26 BUTTON "&Edit" OF oDlg SIZE 45, 13

聽 聽@ 3.4, 26 BUTTON "&Delete" OF oDlg SIZE 45, 13 ;
聽 聽 聽ACTION DelField (@aFields, @cFieldName, oGet, oBrw)

聽 聽@ 4.4, 26 BUTTON "Move &Up" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION If( oBrw:nArrayAt > 1,;
聽 聽 聽 聽 聽 聽 聽 聽 聽( aTemp := aFields[ oBrw:nArrayAt ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt ] := aFields[ oBrw:nArrayAt - 1 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt - 1 ] := aTemp,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:GoUp() ),)

聽 聽@ 5.4, 26 BUTTON "Move D&own" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION If( oBrw:nArrayAt < Len( aFields ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽( aTemp := aFields[ oBrw:nArrayAt ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt ] := aFields[ oBrw:nArrayAt + 1 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt + 1 ] := aTemp,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:GoDown() ),)

聽 聽@ 6.4, 26 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End()

聽 聽@ 12.1, 2 SAY "DBF Name:" OF oDlg SIZE 30, 8

聽 聽@ 14, 6 GET cDbfName PICTURE "!!!!!!!!!!!!" OF oDlg SIZE 100, 11

聽 聽@ 10, 26 BUTTON "&Create" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( If( ! Empty( cDbfName ) .and. Len( aFields ) > 0,;
聽 聽 聽 聽 聽 DbCreate( AllTrim( cDbfName ), aFields ),), oDlg:End(),;
聽 聽 聽 聽 聽 Open( hb_CurDrive() + ":\" + CurDir() + "\" + AllTrim( cDbfName ) ) )

聽 聽ACTIVATE DIALOG oDlg CENTERED ON INIT Eval (bChange)

return nil
聽 聽 
//----------------------------------------------------------------------------//

function AddField( aFields, cFieldName, cType, nLen, nDec, oGet, oBrw )

聽 聽if Empty( cFieldName )
聽 聽 聽 oGet:SetPos( 0 )
聽 聽 聽 return nil
聽 聽endif 聽 

聽 聽if Len( aFields ) == 1 .and. Empty( aFields[ 1 ][ 1 ] )
聽 聽 聽 aFields = { { cFieldName, Upper( Left( cType, 1 ) ), nLen, nDec } }
聽 聽else 聽 
聽 聽 聽 AAdd( aFields, { cFieldName, Upper( Left( cType, 1 ) ), nLen, nDec } )
聽 聽endif
聽 聽 聽 
聽 聽oBrw:SetArray( aFields )
聽 聽oGet:VarPut( cFieldName := Space( 10 ) )
聽 聽oGet:SetPos( 0 )
聽 聽oGet:SetFocus()
聽 聽oBrw:GoBottom()
聽 聽 聽 聽 聽 聽 聽 聽
return nil

//----------------------------------------------------------------------------// 聽

function OrdTagsCount()

聽 聽local n, nCount := 0
聽 聽
聽 聽for n = 1 to 100
聽 聽 聽 if ! Empty( OrdName( n ) )
聽 聽 聽 聽 聽nCount++
聽 聽 聽 endif 聽 
聽 聽next
聽 聽
return nCount 聽 
聽 聽
//----------------------------------------------------------------------------// 聽

function Paste()

聽 聽if oWndMain:oWndActive != nil
聽 聽 聽 oWndMain:oWndActive:Paste()
聽 聽endif 聽 

return nil

//----------------------------------------------------------------------------// 聽

#pragma BEGINDUMP

#include <hbapi.h>
#include <hbapirdd.h>

HB_FUNC( ORDCONDGET )
{
聽 聽AREAP pArea = ( AREAP ) hb_rddGetCurrentWorkAreaPointer();
聽 聽
聽 聽if( pArea )
聽 聽{
聽 聽 聽 LPDBORDERCONDINFO lpdbOrdCondInfo = pArea->lpdbOrdCondInfo;
聽 聽 聽 
聽 聽 聽 if( lpdbOrdCondInfo && lpdbOrdCondInfo->abWhile )
聽 聽 聽 聽 聽hb_retc( lpdbOrdCondInfo->abWhile );
聽 聽 聽 else
聽 聽 聽 聽 聽hb_retc( "" ); 聽 
聽 聽}
聽 聽else
聽 聽 聽 hb_retc( "" ); 聽 聽 
}

#pragma ENDDUMP

//----------------------------------------------------------------------------//
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: FiveDBU para 32/64 bits
Posted: Tue Jun 05, 2012 12:36 PM
Comenzada la implementaci贸n de la lista de funciones en el constructor de expresiones:



Code (fw): Select all Collapse
#include "FiveWin.ch"
#include "xbrowse.ch"

#ifdef __XHARBOUR__
聽 聽#define hb_CurDrive() CurDrive()
#endif 聽 

#define GENBLOCK(x) 聽&( "{ || " + x + " }" )

REQUEST DBFCDX

static oWndMain, oMruDBFs, aSearches := {}

//----------------------------------------------------------------------------//

function Main( cDbfName )

聽 聽local oBar, oBmpTiled
聽 聽
聽 聽SET DATE FORMAT TO "DD/MM/YYYY"

聽 聽SetDlgGradient( { { 1, RGB( 199, 216, 237 ), RGB( 237, 242, 248 ) } } )

聽 聽DEFINE BITMAP oBmpTiled RESOURCE "background"

聽 聽DEFINE WINDOW oWndMain TITLE "FiveDBU" MDI MENU BuildMenu()

聽 聽DEFINE BUTTONBAR oBar OF oWndMain 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "New" RESOURCE "new" ACTION New()

聽 聽DEFINE BUTTON OF oBar PROMPT "Open" RESOURCE "open" ACTION Open()

聽 聽DEFINE BUTTON OF oBar PROMPT "Copy" RESOURCE "copy" ACTION Copy() GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Paste" RESOURCE "paste" ACTION Paste()

聽 聽DEFINE BUTTON OF oBar PROMPT "Prev" RESOURCE "prev" ;
聽 聽 聽 ACTION oWndMain:PrevWindow() GROUP WHEN Len( oWndMain:oWndClient:aWnd ) > 1

聽 聽DEFINE BUTTON OF oBar PROMPT "Next" RESOURCE "next" ;
聽 聽 聽 ACTION oWndMain:NextWindow() WHEN Len( oWndMain:oWndClient:aWnd ) > 1

聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWndMain:End() GROUP

聽 聽DEFINE MSGBAR PROMPT "FiveDBU 32/64 bits, (c) FiveTech Software 2012" ;
聽 聽 聽 OF oWndMain 2010 KEYBOARD DATE

聽 聽if ! Empty( cDbfName )
聽 聽 聽 Open( cDbfName )
聽 聽endif 聽 

聽 聽ACTIVATE WINDOW oWndMain MAXIMIZED ;
聽 聽 聽 VALID MsgYesNo( "Want to end ?" ) ;
聽 聽 聽 ON PAINT DrawTiled( hDC, oWndMain, oBmpTiled )
聽 聽
聽 聽oBmpTiled:End() 聽 聽 聽

return nil

//----------------------------------------------------------------------------//

function BuildMenu()

聽 聽local oMenu
聽 聽
聽 聽MENU oMenu
聽 聽 聽 MENUITEM "Files"
聽 聽 聽 MENU
聽 聽 聽 聽 聽MENUITEM "New..."
聽 聽 聽 聽 聽MENUITEM "Open..." ACTION Open()
聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 聽 聽MENUITEM "Recent files"
聽 聽 聽 聽 聽MENU
聽 聽 聽 聽 聽 聽 MRU oMruDBFs ;
聽 聽 聽 聽 聽 聽 聽 聽FILENAME ".\FiveDBU.ini" ; 聽 聽// .INI to manipulate. '\.' for local
聽 聽 聽 聽 聽 聽 聽 聽SECTION 聽"Recent DBF files" ; // The name of the INI section
聽 聽 聽 聽 聽 聽 聽 聽ACTION 聽 Open( cMruItem ) ; 聽 // cMruItem is automatically provided
聽 聽 聽 聽 聽 聽 聽 聽MESSAGE 聽"Open this file" ; 聽 // The message for all of them
聽 聽 聽 聽 聽 聽 聽 聽SIZE 聽 聽 10
聽 聽 聽 聽 聽ENDMENU 聽 聽 聽 

聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 聽 聽MENUITEM "Exit" ACTION oWndMain:End()
聽 聽 聽 ENDMENU
聽 聽 聽 
聽 聽 聽 // oMenu:AddEdit()
聽 聽 聽 oMenu:AddMdi()
聽 聽 聽 oMenu:AddHelp( "FiveDBU", "(c) FiveTech Software 2012" )
聽 聽ENDMENU
聽 聽
return oMenu 聽 聽 聽

//----------------------------------------------------------------------------//

function Open( cFileName )

聽 聽local oWnd, oBar, oBrw, oMsgBar, oMsgDeleted, oMsgTagName
聽 聽local oPopup, cAlias, n, cClrBack, nTags
聽 聽
聽 聽DEFAULT cFileName := cGetFile( "*.dbf", "Please select a DBF" )
聽 聽
聽 聽if Empty( cFileName )
聽 聽 聽 return nil
聽 聽endif 聽 
聽 聽
聽 聽if ! "." $ cFileName
聽 聽 聽 cFileName += ".dbf"
聽 聽endif 聽 
聽 聽
聽 聽if ! File( cFileName )
聽 聽 聽 MsgStop( "File not found: " + cFileName )
聽 聽 聽 return nil
聽 聽endif
聽 聽
聽 聽if File( cFileNoExt( cFileName ) + ".ntx" )
聽 聽 聽 USE ( cFileName ) VIA "DBFNTX" NEW SHARED ;
聽 聽 聽 聽 聽ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )
聽 聽else 聽 
聽 聽 聽 USE ( cFileName ) VIA "DBFCDX" NEW SHARED ;
聽 聽 聽 聽 聽ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )
聽 聽 聽 cAlias = Alias()
聽 聽endif 聽 聽 聽 聽
聽 聽
聽 聽oMruDBFs:Save( cFileName )
聽 聽
聽 聽MENU oPopup POPUP
聽 聽 聽 MENUITEM "Natural order" ;
聽 聽 聽 聽 聽ACTION ( ( cAlias )->( DbSetOrder( 0 ) ), oBrw:Refresh(), oBrw:SetFocus(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 ( cAlias )->( Eval( oBrw:bChange ) ) )
聽 聽 聽 
聽 聽 聽 if ( nTags := ( cAlias )->( OrdTagsCount() ) ) > 0
聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 endif 聽 
聽 聽 聽 
聽 聽 聽 for n = 1 to nTags
聽 聽 聽 聽 聽if ! Empty( OrdName( n ) )
聽 聽 聽 聽 聽 聽 if ! Empty( OrdName( 1 ) )
聽 聽 聽 聽 聽 聽 聽 聽DbSetOrder( OrdName( 1 ) )
聽 聽 聽 聽 聽 聽 聽 聽DbGoTop()
聽 聽 聽 聽 聽 聽 endif 聽 
聽 聽 聽 聽 聽 聽 MENUITEM OrdName( n ) ;
聽 聽 聽 聽 聽 聽 聽 聽ACTION ( ( cAlias )->( DbSetOrder( oMenuItem:cPrompt ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oBrw:Refresh(), ( cAlias )->( Eval( oBrw:bChange ) ), oBrw:SetFocus() )
聽 聽 聽 聽 聽endif
聽 聽 聽 next 聽 聽
聽 聽ENDMENU 聽 
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Browse " + cFileName MDICHILD

聽 聽oWnd:bCopy = { || MsgInfo( "copy" ) }

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
聽 聽 聽 ACTION ( ( oBrw:cAlias )->( DbAppend() ), oBrw:Refresh(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
聽 聽 聽 ACTION ( oBrw:cAlias )->( Edit() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
聽 聽 聽 ACTION ( obrw:cAlias )->( DelRecord( oBrw, oMsgDeleted ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Search" RESOURCE "search" ;
聽 聽 聽 GROUP ACTION ( cAlias )->( Search( oBrw ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Index" RESOURCE "index" ;
聽 聽 聽 MENU oPopup ACTION ( cAlias )->( Indexes() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Top" RESOURCE "top" ;
聽 聽 聽 ACTION ( oBrw:GoTop(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Bottom" RESOURCE "bottom" ;
聽 聽 聽 ACTION ( oBrw:GoBottom(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Struct" RESOURCE "struct" ;
聽 聽 聽 ACTION ( oBrw:cAlias )->( Struct() ) GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report()

聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd LINES ;
聽 聽 聽 ON CHANGE ( oMsgBar:cMsgDef := "Alias: " + Alias() + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽" RecNo: " + AllTrim( Str( RecNo() ) ) + "/" + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽AllTrim( Str( RecCount() ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgBar:Refresh(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgTagName:SetText( "Ordered by: " + If( ! Empty( OrdName() ), OrdName(), "Natural order" ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgDeleted:SetText( If( ( oBrw:cAlias )->( Deleted() ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"DELETED", "NON DELETED" ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgDeleted:SetBitmap( If( ( oBrw:cAlias )->( Deleted() ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"deleted", "nondeleted" ) ) )

聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_BLACK ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_BLACK ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_WHITE ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 0x33, 0x66, 0xCC ) } }
聽 聽cClrBack = Eval( oBrw:bClrSelFocus )[ 2 ] 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:bClrSelFocus = { || { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_WHITE ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 cClrBack } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽oBrw:bLDblClick = { || ( oBrw:cAlias )->( Edit() ) } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽
聽 聽oWnd:oClient = oBrw
聽 聽oWnd:oControl = oBrw

聽 聽DEFINE MSGBAR oMsgBar PROMPT "Alias: " + Alias() + " | RecNo: " + ;
聽 聽 聽 AllTrim( Str( RecNo() ) ) + "/" + ;
聽 聽 聽 AllTrim( Str( RecCount() ) ) ;
聽 聽 聽 OF oWnd 2010 

聽 聽DEFINE MSGITEM oMsgTagName OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT "Ordered by: " + ;
聽 聽 聽 聽 聽 If( ! Empty( ( oBrw:cAlias )->( OrdName() ) ),;
聽 聽 聽 聽 聽 聽 聽 ( oBrw:cAlias )->( OrdName() ), "Natural order" ) ;
聽 聽 聽 聽 聽 SIZE 150

聽 聽DEFINE MSGITEM oMsgDeleted OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT If( ( oBrw:cAlias )->( Deleted() ), "DELETED", "NON DELETED" ) ;
聽 聽 聽 聽 聽 SIZE 130 ;
聽 聽 聽 聽 聽 BITMAPS "nondeleted" ;
聽 聽 聽 聽 聽 ACTION ( oBrw:cAlias )->( DelRecord( oBrw, oMsgDeleted ) ) 聽 
聽 聽 聽 聽 聽 
聽 聽ACTIVATE WINDOW oWnd ;
聽 聽 聽 VALID ( ( cAlias )->( DbCloseArea() ), oBrw:cAlias := "", .T. )
聽 聽
return nil 聽 

//----------------------------------------------------------------------------//

function Copy()

聽 聽if oWndMain:oWndActive != nil
聽 聽 聽 oWndMain:oWndActive:Copy()
聽 聽endif 聽 

return nil

//----------------------------------------------------------------------------//
聽 
function DelField( aFields, cFieldName, oGet, oBrw )

聽 聽if Len( aFields ) >= 1
聽 聽 聽 ADel( aFields, oBrw:nArrayAt, .T. )
聽 聽 聽 oBrw:SetArray( aFields )
聽 聽endif

聽 聽oGet:VarPut( cFieldName := Space( 10 ) )
聽 聽oGet:SetPos( 0 )
聽 聽oGet:SetFocus()
聽 聽oBrw:GoBottom()
聽 聽 聽 聽 聽 聽 聽 聽
return nil

//----------------------------------------------------------------------------//
聽 聽 聽 聽
function DelRecord( oBrw, oMsgDeleted )

聽 聽if ! Deleted() 
聽 聽 聽 if ! MsgYesNo( "Want to delete this record ?" )
聽 聽 聽 聽 聽return nil
聽 聽 聽 endif 聽 
聽 聽 聽 DbRLock() 聽 
聽 聽 聽 DbDelete() 聽 
聽 聽 聽 DbUnlock() 聽 
聽 聽 聽 oMsgDeleted:SetText( "DELETED" )
聽 聽 聽 oMsgDeleted:SetBitmap( "deleted" )
聽 聽else
聽 聽 聽 DbRLock() 聽 
聽 聽 聽 DbRecall() 聽 
聽 聽 聽 DbUnlock() 聽 聽 聽 聽 
聽 聽 聽 oMsgDeleted:SetText( "NON DELETED" )
聽 聽 聽 oMsgDeleted:SetBitmap( "nondeleted" )
聽 聽 聽 MsgInfo( "UnDeleted record" )
聽 聽endif
聽 聽
聽 聽Eval( oBrw:bChange )
聽 聽oBrw:Refresh()

return nil 聽 

//----------------------------------------------------------------------------//
聽 聽
function Edit()

聽 聽local oWnd, aRecord := ( Alias() )->( LoadRecord() ), oBar, oBrw, oMsgBar
聽 聽local cAlias := Alias(), oBtnSave, nRecNo := ( Alias() )->( RecNo() )
聽 聽local oMsgDeleted
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Edit " + Alias() MDICHILD

聽 聽oWndMain:oBar:AEvalWhen()

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON oBtnSave OF oBar PROMPT "Save" RESOURCE "save" ;
聽 聽 聽 ACTION ( ( cAlias )->( SaveRecord( aRecord, nRecNo ) ), oBtnSave:Disable() )

聽 聽oBtnSave:Disable()

聽 聽DEFINE BUTTON OF oBar PROMPT "Prev" RESOURCE "prev" ;
聽 聽 聽 ACTION GoPrevRecord( oBrw, aRecord, oMsgDeleted ) GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Next" RESOURCE "next" ;
聽 聽 聽 ACTION GoNextRecord( oBrw, aRecord, oMsgDeleted ) 

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report() GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "View" RESOURCE "view" ;
聽 聽 聽 ACTION View( oBrw:aRow[ 2 ], oWnd )
聽 聽 聽 
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd ARRAY aRecord AUTOCOLS LINES ;
聽 聽 聽 HEADERS "FieldName", "Value" COLSIZES 150, 400 FASTEDIT ;
聽 聽 聽 ON CHANGE ( ( cAlias )->( SetEditType( oBrw, oBtnSave ) ), oBrw:DrawLine( .T. ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 oMsgBar:cMsgDef := " RecNo: " + AllTrim( Str( ( cAlias )->( RecNo() ) ) ) + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"/" + AllTrim( Str( ( cAlias )->( RecCount() ) ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 oMsgBar:Refresh() ) 聽 聽 聽 聽 聽 聽 聽 聽 

聽 聽oBrw:nEditTypes = EDIT_GET
聽 聽oBrw:aCols[ 1 ]:nEditType = 0 // Don't allow to edit first column
聽 聽oBrw:aCols[ 2 ]:bOnChange = { || oBtnSave:Enable() }
聽 聽oBrw:aCols[ 2 ]:lWillShowABtn = .T.
聽 聽oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽
聽 聽oWnd:oClient = oBrw

聽 聽DEFINE MSGBAR oMsgBar ;
聽 聽 聽 PROMPT " RecNo: " + AllTrim( Str( ( cAlias )->( RecNo() ) ) ) + "/" + ;
聽 聽 聽 AllTrim( Str( ( cAlias )->( RecCount() ) ) ) OF oWnd 2010

聽 聽DEFINE MSGITEM oMsgDeleted OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT If( ( cAlias )->( Deleted() ), "DELETED", "NON DELETED" ) ;
聽 聽 聽 聽 聽 SIZE 130 ;
聽 聽 聽 聽 聽 BITMAPS If( ( cAlias )->( Deleted() ), "deleted", "nondeleted" ) ;
聽 聽 聽 聽 聽 ACTION ( cAlias )->( DelRecord( oBrw, oMsgDeleted ) ) 聽 
聽 聽
聽 聽ACTIVATE WINDOW oWnd
聽 聽
return nil 聽 聽 聽

//----------------------------------------------------------------------------//

function GoPrevRecord( oBrw, aRecord, oMsgDeleted )

聽 聽DbSkip( -1 )
聽 聽
聽 聽oBrw:SetArray( aRecord := LoadRecord() )
聽 聽oBrw:SetFocus()
聽 聽Eval( oBrw:bChange )

聽 聽oMsgDeleted:SetText( If( Deleted(), "DELETED", "NON DELETED" ) )
聽 聽oMsgDeleted:SetBitmap( If( Deleted(), "deleted", "nondeleted" ) )
聽 聽
return nil

//----------------------------------------------------------------------------//

function GoNextRecord( oBrw, aRecord, oMsgDeleted )

聽 聽DbSkip( 1 )
聽 聽
聽 聽If Eof()
聽 聽 聽 DbSkip( -1 )
聽 聽else
聽 聽 聽 oBrw:SetArray( aRecord := LoadRecord() )
聽 聽 聽 oBrw:SetFocus()
聽 聽 聽 Eval( oBrw:bChange )
聽 聽endif 聽 

聽 聽oMsgDeleted:SetText( If( Deleted(), "DELETED", "NON DELETED" ) )
聽 聽oMsgDeleted:SetBitmap( If( Deleted(), "deleted", "nondeleted" ) )
聽 聽
return nil

//----------------------------------------------------------------------------//

function SetEditType( oBrw, oBtnSave )

聽 聽local cType := FieldType( oBrw:nArrayAt )
聽 聽
聽 聽do case
聽 聽 聽 case cType == "M"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_BUTTON
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:bEditBlock = { | c | c := oBrw:aRow[ 2 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽MemoEdit( @oBrw:aRow[ 2 ], FieldName( oBrw:nArrayAt ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( ! c == oBrw:aRow[ 2 ], oBtnSave:Enable(),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:aRow[ 2 ] }
聽 聽
聽 聽 聽 case cType == "D"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_BUTTON
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:bEditBlock = { || If( ! Empty( oBrw:aRow[ 2 ] ) .and. ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽! AllTrim( oBrw:aRow[ 2 ] ) == "/ 聽/",;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽DToC( MsgDate( CtoD( oBrw:aRow[ 2 ] ) ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽DToC( MsgDate( Date() ) ) ) }
聽 聽
聽 聽 聽 case cType == "L"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_LISTBOX
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:aEditListTxt 聽 = { ".T.", ".F." }
聽 聽 聽 聽 聽 聽
聽 聽 聽 otherwise
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_GET
聽 聽endcase
聽 聽
return nil 聽 聽 聽 聽 聽 聽 聽

//----------------------------------------------------------------------------//

function IndexBuilder()

聽 聽local oDlg, cExp := Space( 80 ), cTo := Space( 80 ), cTag := Space( 20 )
聽 聽local cFor := Space( 80 ), cWhile := Space( 80 ), lUnique := .F.
聽 聽local lDescend := .F., lMemory := .F., cScope := "All", nRecNo
聽 聽local oPgr, nMeter := 0, nStep := 10, lTag := .T. 
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Index builder" SIZE 530, 380 

聽 聽@ 0.4, 3 SAY "Expression:" OF oDlg SIZE 40, 8

聽 聽@ 0.5, 6 GET cExp OF oDlg SIZE 200, 11 ACTION ExpBuilder( @cExp ) ;
聽 聽 聽 VALID ! Empty( cExp )
聽 聽
聽 聽@ 1.5, 6 SAY "To:" OF oDlg SIZE 40, 8

聽 聽@ 1.7, 6 GET cTo OF oDlg SIZE 200, 11

聽 聽@ 2.6, 5.5 SAY "Tag:" OF oDlg SIZE 40, 8

聽 聽@ 聽 3, 6 GET cTag OF oDlg SIZE 100, 11
聽 聽
聽 聽@ 3.7, 5.9 SAY "For:" OF oDlg SIZE 40, 8

聽 聽@ 4.3, 6 GET cFor OF oDlg SIZE 200, 11 ACTION ExpBuilder()

聽 聽@ 4.8, 5 SAY "While:" OF oDlg SIZE 40, 8

聽 聽@ 5.6, 6 GET cWhile OF oDlg SIZE 200, 11 ACTION ExpBuilder()
聽 聽
聽 聽@ 6.8, 6.9 CHECKBOX lUnique PROMPT "&Unique" OF oDlg SIZE 50, 8

聽 聽@ 6.8, 13.9 CHECKBOX lDescend PROMPT "&Descending" OF oDlg SIZE 80, 8

聽 聽@ 6.8, 23 CHECKBOX lMemory PROMPT "&Memory" OF oDlg SIZE 80, 8

聽 聽@ 6.8, 8 SAY "Scope:" OF oDlg SIZE 40, 8
聽 聽
聽 聽@ 8.2, 6 COMBOBOX cScope ITEMS { "All", "Next", "Record", "Rest" } OF oDlg

聽 聽@ 6.8, 16.1 SAY "Record:" OF oDlg SIZE 40, 8

聽 聽@ 8.8, 12.1 GET nRecNo OF oDlg SIZE 30, 11

聽 聽@ 8.5, 8 SAY "Progress:" OF oDlg SIZE 40, 8
聽 聽
聽 聽@ 9.2, 8 PROGRESS oPgr OF oDlg SIZE 200, 10
聽 聽
聽 聽@ 9.2, 13 BUTTON "C&reate" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( OrdCondSet( If( ! Empty( cFor ), cFor,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( ! Empty( cFor ), GENBLOCK( cFor ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "All", .T.,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( ! Empty( cWhile ), GENBLOCK( cWhile ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ || nMeter += nStep, oPgr:SetPos( nMeter ), SysRefresh() },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nStep, Recno(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "Next", nRecNo,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "Record", nRecNo,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "Rest", .T.,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( lDescend, .T.,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽lTag,, .F., .F., .F., .T., .F., .F. ),;
聽 聽 聽 聽 聽 聽 聽 聽OrdCreate( OrdBagName(), If( lTag, cTag,), cExp, GENBLOCK( cExp ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( lUnique, .T.,) ), oDlg:End() ) 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽

聽 聽@ 9.2, 24 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End() CANCEL
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED

return nil

//----------------------------------------------------------------------------//

function Indexes()

聽 聽local oWnd, oBar, oBrw, oMsgBar
聽 聽local cAlias := Alias(), aIndexes := {}, n 
聽 聽
聽 聽for n = 1 to 15
聽 聽 聽 if ! Empty( OrdName( n ) )
聽 聽 聽 聽 聽AAdd( aIndexes, { n,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽OrdName( n ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽OrdKey( n ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽OrdFor( n ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽OrdBagName( n ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽OrdBagExt( n ) } )
聽 聽 聽 endif 聽 
聽 聽next 聽 聽
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Indexes of " + Alias() MDICHILD

聽 聽oWndMain:oBar:AEvalWhen()

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70

聽 聽DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
聽 聽 聽 ACTION ( IndexBuilder(), oBrw:Refresh(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
聽 聽 聽 ACTION ( MsgInfo( "Edit" ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
聽 聽 聽 ACTION If( MsgYesNo( "Want to delete this tag ?" ),;
聽 聽 聽 聽 聽 聽 聽 聽 ( ( cAlias )->( OrdBagClear( oBrw:nArrayAt ) ), oBrw:Refresh() ),)

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report() GROUP
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd ARRAY aIndexes AUTOCOLS LINES ;
聽 聽 聽 HEADERS "Order", "TagName", "Expression", "For", "BagName", "BagExt" ;
聽 聽 聽 COLSIZES 50, 150, 400, 400, 150, 150

聽 聽oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽
聽 聽oWnd:oClient = oBrw

聽 聽DEFINE MSGBAR oMsgBar 2010
聽 聽
聽 聽ACTIVATE WINDOW oWnd 

return nil

//----------------------------------------------------------------------------//

function ExpBuilder( cExp )

聽 聽local oDlg, oBrw, aFields := DBStruct()
聽 聽local oExp, cFunction
聽 聽
聽 聽cExp = RTrim( cExp )
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Expression builder" SIZE 480, 450
聽 聽
聽 聽@ 0.2, 1.5 SAY "Expression:" SIZE 80, 11 OF oDlg
聽 聽
聽 聽@ 1.1, 1 GET oExp VAR cExp MEMO SIZE 221, 27
聽 聽
聽 聽@ 3, 1.5 SAY "Fields" OF oDlg SIZE 40, 10
聽 聽
聽 聽@ 4, 1 XBROWSE oBrw ARRAY aFields AUTOCOLS LINES SIZE 120, 120 ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 95, 30, 30, 30 
聽 聽 聽 
聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:bLDblClick = { || cExp += oBrw:aRow[ 1 ], oExp:Refresh() } 

聽 聽@ 3, 23.1 SAY "Operators" OF oDlg SIZE 40, 10

聽 聽@ 3.1, 23 BUTTON "=" OF oDlg SIZE 15, 15 ACTION ( cExp += " = ", oExp:Refresh() )

聽 聽@ 3.1, 26.2 BUTTON "<>" OF oDlg SIZE 15, 15 ACTION ( cExp += " <> ", oExp:Refresh() )

聽 聽@ 3.1, 29.4 BUTTON "+" OF oDlg SIZE 15, 15 ACTION ( cExp += " + ", oExp:Refresh() )

聽 聽@ 3.1, 32.6 BUTTON "(" OF oDlg SIZE 15, 15 ACTION ( cExp += " ( ", oExp:Refresh() )

聽 聽@ 3.1, 35.8 BUTTON ".T." OF oDlg SIZE 15, 15 ACTION ( cExp += " .T. ", oExp:Refresh() )

聽 聽@ 4.1, 23 BUTTON "<" OF oDlg SIZE 15, 15 ACTION ( cExp += " < ", oExp:Refresh() )

聽 聽@ 4.1, 26.2 BUTTON ">" OF oDlg SIZE 15, 15 ACTION ( cExp += " > ", oExp:Refresh() )

聽 聽@ 4.1, 29.4 BUTTON "-" OF oDlg SIZE 15, 15 ACTION ( cExp += " - ", oExp:Refresh() )

聽 聽@ 4.1, 32.6 BUTTON ")" OF oDlg SIZE 15, 15 ACTION ( cExp += " )", oExp:Refresh() )

聽 聽@ 4.1, 35.8 BUTTON ".F." OF oDlg SIZE 15, 15 ACTION ( cExp += " .F. ", oExp:Refresh() )

聽 聽@ 5.1, 23 BUTTON "<=" OF oDlg SIZE 15, 15 ACTION ( cExp += " <= ", oExp:Refresh() )

聽 聽@ 5.1, 26.2 BUTTON ">=" OF oDlg SIZE 15, 15 ACTION ( cExp += " >= ", oExp:Refresh() )

聽 聽@ 5.1, 29.4 BUTTON "*" OF oDlg SIZE 15, 15 ACTION ( cExp += " * ", oExp:Refresh() )

聽 聽@ 5.1, 32.6 BUTTON "/" OF oDlg SIZE 15, 15 ACTION ( cExp += " / ", oExp:Refresh() )

聽 聽@ 5.1, 35.8 BUTTON "$" OF oDlg SIZE 15, 15 ACTION ( cExp += " $ ", oExp:Refresh() )

聽 聽@ 6.1, 23 BUTTON '"' OF oDlg SIZE 15, 15 ACTION ( cExp += '"', oExp:Refresh() )

聽 聽@ 6.1, 26.2 BUTTON "!" OF oDlg SIZE 15, 15 ACTION ( cExp += " ! ", oExp:Refresh() )

聽 聽@ 6.1, 29.4 BUTTON "SP" OF oDlg SIZE 15, 15 ACTION ( cExp += " ", oExp:Refresh() )

聽 聽@ 6.1, 32.6 BUTTON "," OF oDlg SIZE 15, 15 ACTION ( cExp += ", ", oExp:Refresh() )

聽 聽@ 6.1, 35.8 BUTTON ":" OF oDlg SIZE 15, 15 ACTION ( cExp += " : ", oExp:Refresh() )

聽 聽@ 7.1, 23 BUTTON "AND" OF oDlg SIZE 27, 15 ACTION ( cExp += " .and. ", oExp:Refresh() )

聽 聽@ 7.1, 28.4 BUTTON "OR" OF oDlg SIZE 27, 15 ACTION ( cExp += " .or. ", oExp:Refresh() )

聽 聽@ 7.1, 33.7 BUTTON "NOT" OF oDlg SIZE 27, 15 ACTION ( cExp += " ! ", oExp:Refresh() )

聽 聽@ 10.3, 23.2 SAY "Functions" OF oDlg SIZE 84, 11

聽 聽@ 11.9, 17.3 COMBOBOX cFunction ITEMS { "AllTrim()", "Left()", "Right()", "SubStr()" } ;
聽 聽 聽 OF oDlg SIZE 92, 80 ON CHANGE ( cExp += Left( cFunction, Len( cFunction ) - 1 ) + " ",;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oExp:Refresh() )

聽 聽@ 11, 13 BUTTON "&Ok" OF oDlg SIZE 45, 13 ACTION oDlg:End()

聽 聽@ 11, 24 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End() CANCEL
聽 聽 聽 聽 聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED

return cExp

//----------------------------------------------------------------------------//

function LoadRecord()

聽 聽local aRecord := {}, n
聽 聽
聽 聽for n = 1 to FCount()
聽 聽 聽 AAdd( aRecord, { FieldName( n ), FieldGet( n ) } )
聽 聽next
聽 聽
return aRecord 聽 聽 聽
聽 聽
//----------------------------------------------------------------------------// 

function Search( oBrw )

聽 聽local oDlg, oCbx, cSearch := Space( 50 )
聽 聽local nRecNo := RecNo(), lInc := .T.
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Search: " + Alias() SIZE 400, 200
聽 聽
聽 聽@ 0.5, 1.5 SAY "Ordered by: " + OrdName() OF oDlg
聽 聽
聽 聽@ 1.2, 1.5 SAY "Key: " + OrdKey() OF oDlg
聽 聽
聽 聽@ 2.4, 1.2 COMBOBOX oCbx VAR cSearch ITEMS aSearches OF oDlg SIZE 180, 150 ;
聽 聽 聽STYLE CBS_DROPDOWN
聽 聽
聽 聽oCbx:oGet:bChange = { || DbSeek( AllTrim( oCbx:GetText() ), lInc ), oBrw:Refresh() } 
聽 聽
聽 聽@ 3.7, 1.5 CHECKBOX lInc PROMPT "&Incremental" OF oDlg SIZE 80, 10
聽 聽
聽 聽@ 4, 7 BUTTON "&Ok" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( If( ! DbSeek( AllTrim( cSearch ), lInc ), DbGoTo( nRecNo ),),;
聽 聽 聽 聽 聽 聽 聽 聽AAdd( aSearches, AllTrim( cSearch ) ), oDlg:End() )

聽 聽@ 4, 18 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End()
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED
聽 聽
return nil 聽 

//----------------------------------------------------------------------------// 

function SaveRecord( aRecord, nRecNo )

聽 聽local n

聽 聽( Alias() )->( DbGoTo( nRecNo ) )
聽 聽
聽 聽if ( Alias() )->( DbRLock( nRecNo ) )
聽 聽 聽 for n = 1 to Len( aRecord )
聽 聽 聽 聽 聽( Alias() )->( FieldPut( n, aRecord[ n ][ 2 ] ) )
聽 聽 聽 next
聽 聽 聽 ( Alias() )->( DbUnLock() )
聽 聽 聽 MsgInfo( "Record updated" )
聽 聽else
聽 聽 聽 MsgAlert( "Record in use, please try it again" )
聽 聽endif 聽 聽 聽 聽 

return nil 聽 聽 聽

//----------------------------------------------------------------------------// 

function Struct()

聽 聽local oDlg, oBrw, aFields := DbStruct()
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE Alias() + " fields" SIZE 400, 400

聽 聽@ 0, 0 XBROWSE oBrw ARRAY aFields AUTOCOLS LINES ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 150, 50, 80, 80

聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽
聽 聽oBrw:CreateFromCode()
聽 聽 聽 
聽 聽oDlg:oClient = oBrw
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED ;
聽 聽 聽 ON INIT ( BuildStructBar( oDlg, oBrw ), oDlg:Resize(), oBrw:SetFocus() )
聽 聽
return nil 聽 

//----------------------------------------------------------------------------// 

function BuildStructBar( oDlg, oBrw )

聽 聽local oBar

聽 聽DEFINE BUTTONBAR oBar OF oDlg 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Code" RESOURCE "code" ;
聽 聽 聽 ACTION ( TxtStruct(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oDlg:End() GROUP

return nil

//----------------------------------------------------------------------------// 

function TxtStruct()

聽 聽local cCode := "local aFields := { ", n
聽 聽
聽 聽for n = 1 to FCount()
聽 聽 聽 if n > 1
聽 聽 聽 聽 聽cCode += Space( 27 )
聽 聽 聽 endif 聽 
聽 聽 聽 cCode += '{ "' + FieldName( n ) + '", "' + ;
聽 聽 聽 聽 聽 聽 聽 聽FieldType( n ) + '", ' + ;
聽 聽 聽 聽 聽 聽 聽 聽AllTrim( Str( FieldLen( n ) ) ) + ", " + ;
聽 聽 聽 聽 聽 聽 聽 聽AllTrim( Str( FieldDec( n ) ) ) + " },;" + CRLF
聽 聽next
聽 聽
聽 聽cCode = SubStr( cCode, 1, Len( cCode ) - 4 ) + " }"
聽 聽
聽 聽MemoEdit( cCode, "Code" )

return nil

//----------------------------------------------------------------------------// 聽 

function View( cFileName, oWnd )

聽 聽local cExt := Lower( cFileExt( cFileName ) )
聽 聽
聽 聽do case
聽 聽 聽 case cExt == "bmp"
聽 聽 聽 聽 聽 聽WinExec( "mspaint" + " " + cFileName )
聽 聽 聽 聽 聽 聽
聽 聽 聽 case cExt == "txt"
聽 聽 聽 聽 聽 聽WinExec( "notepad" + " " + cFileName ) 聽 聽 
聽 聽 聽 聽 聽 聽
聽 聽 聽 otherwise
聽 聽 聽 聽 聽 聽ShellExecute( oWnd:hWnd, "Open", cFileName )
聽 聽endcase
聽 聽
return nil 聽 聽 聽 聽 聽 聽 聽 聽

//----------------------------------------------------------------------------// 聽 

function New()

聽 聽local oDlg, oGet, oBrw, oBtn
聽 聽local cFieldName := Space( 10 ), cType := "Character", nLen := 10, nDec := 0
聽 聽local aFields := { Array( 4 ) }, cDbfName := Space( 8 ), aTemp
聽 聽local oLen, oDec, aType := { "Character", "Number", "Date", "Logical", "Memo" }
聽 聽local bChange := {|| If( cType == "Character", (nLen := 10, nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Number", 聽 聽(nLen := 10, nDec := 0, oDec:Enable() 聽),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Date", 聽 聽 聽(nLen := 8, 聽nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Logical", 聽 (nLen := 1, 聽nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Memo", 聽 聽 聽(nLen := 10, nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oDlg:Update() }
聽 聽local bEdit := {|| IF ( !Empty (aFields[1,1]) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 (oBtn:Enable (),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽cFieldName := aFields[oBrw:nArrayAt,1] ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽cType := aFields[oBrw:nArrayAt,2] ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽cType := aType[ aScan(aType, {|x| Left(x,1) = cType} )],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽Eval (bChange) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nLen := aFields[oBrw:nArrayAt,3] ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nDec := aFields[oBrw:nArrayAt,4] ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oGet:SetPos( 0 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oGet:SetFocus(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oDlg:Update() ) ,) ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽}
聽 聽local bSave := {|| oBtn:Disable (),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aFields[oBrw:nArrayAt,1] := cFieldname,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aFields[oBrw:nArrayAt,2] := Left (cType,1),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aFields[oBrw:nArrayAt,3] := nLen,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aFields[oBrw:nArrayAt,4] := nDec,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oBrw:SetArray (aFields),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 cFieldName := Space( 10 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Eval (bChange) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oDlg:Update() ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oGet:SetPos( 0 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oGet:SetFocus(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oBrw:GoBottom();
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 }

聽 聽DEFINE DIALOG oDlg TITLE "DBF builder" SIZE 415, 400

聽 聽@ 0.5, 聽2 SAY "Field Name" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 10 SAY "Type" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 17 SAY "Len" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 22 SAY "Dec" OF oDlg SIZE 20, 8

聽 聽@ 1.4, 1 GET oGet VAR cFieldName PICTURE "!!!!!!!!!!" OF oDlg SIZE 41, 11 UPDATE

聽 聽@ 1.3, 6.5 COMBOBOX cType ITEMS aType ;
聽 聽 聽 OF oDlg ON CHANGE Eval (bChange) UPDATE

聽 聽@ 1.4, 11.9 GET oLen VAR nLen PICTURE "999" OF oDlg SIZE 25, 11 UPDATE

聽 聽@ 1.4, 15.4 GET oDec VAR nDec PICTURE "999" OF oDlg SIZE 25, 11 UPDATE

聽 聽@ 0.9, 26 BUTTON "&Add" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION AddField( @aFields, @cFieldName, @cType, @nLen, @nDec, oGet, oBrw )

聽 聽@ 2.4, 26 BUTTON oBtn PROMPT "&Edit" OF oDlg SIZE 45, 13 ;
聽 聽 聽ACTION Eval (bSave)

聽 聽@ 3.4, 26 BUTTON "&Delete" OF oDlg SIZE 45, 13 ;
聽 聽 聽ACTION DelField (@aFields, @cFieldName, oGet, oBrw)

聽 聽@ 4.4, 26 BUTTON "Move &Up" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION If( oBrw:nArrayAt > 1,;
聽 聽 聽 聽 聽 聽 聽 聽 聽( aTemp := aFields[ oBrw:nArrayAt ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt ] := aFields[ oBrw:nArrayAt - 1 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt - 1 ] := aTemp,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:GoUp() ),)

聽 聽@ 5.4, 26 BUTTON "Move D&own" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION If( oBrw:nArrayAt < Len( aFields ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽( aTemp := aFields[ oBrw:nArrayAt ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt ] := aFields[ oBrw:nArrayAt + 1 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt + 1 ] := aTemp,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:GoDown() ),)

聽 聽@ 6.4, 26 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End()

聽 聽@ 2.2, 2 SAY "Fields" OF oDlg SIZE 40, 8

聽 聽@ 3.2, 1 XBROWSE oBrw ARRAY aFields AUTOCOLS ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 90, 55, 40, 40 ;
聽 聽 聽 SIZE 140, 130 OF oDlg ;
聽 聽 聽 ON DBLCLICK Eval (bEdit)

聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } }
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()

聽 聽@ 12.1, 2 SAY "DBF Name:" OF oDlg SIZE 30, 8

聽 聽@ 14, 6 GET cDbfName PICTURE "!!!!!!!!!!!!" OF oDlg SIZE 100, 11

聽 聽@ 10, 26 BUTTON "&Create" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( If( ! Empty( cDbfName ) .and. Len( aFields ) > 0,;
聽 聽 聽 聽 聽 DbCreate( AllTrim( cDbfName ), aFields ),), oDlg:End(),;
聽 聽 聽 聽 聽 Open( hb_CurDrive() + ":\" + CurDir() + "\" + AllTrim( cDbfName ) ) )

聽 聽ACTIVATE DIALOG oDlg CENTERED ON INIT (Eval (bChange), oBtn:Disable() ) ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽VALID !GETKEYSTATE( VK_ESCAPE )

return nil

//----------------------------------------------------------------------------//

function AddField( aFields, cFieldName, cType, nLen, nDec, oGet, oBrw )

聽 聽if Empty( cFieldName )
聽 聽 聽 oGet:SetPos( 0 )
聽 聽 聽 return nil
聽 聽endif

聽 聽if Len( aFields ) == 1 .and. Empty( aFields[ 1 ][ 1 ] )
聽 聽 聽 aFields = { { cFieldName, Upper( Left( cType, 1 ) ), nLen, nDec } }
聽 聽else
聽 聽 聽 AAdd( aFields, { cFieldName, Upper( Left( cType, 1 ) ), nLen, nDec } )
聽 聽endif

聽 聽oBrw:SetArray( aFields )
聽 聽oGet:VarPut( cFieldName := Space( 10 ) )
聽 聽oGet:SetPos( 0 )
聽 聽oGet:SetFocus()
聽 聽oBrw:GoBottom()

return nil
聽 聽 聽 聽 
//----------------------------------------------------------------------------//

function OrdTagsCount()

聽 聽local n, nCount := 0
聽 聽
聽 聽for n = 1 to 100
聽 聽 聽 if ! Empty( OrdName( n ) )
聽 聽 聽 聽 聽nCount++
聽 聽 聽 endif 聽 
聽 聽next
聽 聽
return nCount 聽 
聽 聽
//----------------------------------------------------------------------------// 聽

function Paste()

聽 聽if oWndMain:oWndActive != nil
聽 聽 聽 oWndMain:oWndActive:Paste()
聽 聽endif 聽 

return nil

//----------------------------------------------------------------------------// 聽

#pragma BEGINDUMP

#include <hbapi.h>
#include <hbapirdd.h>

HB_FUNC( ORDCONDGET )
{
聽 聽AREAP pArea = ( AREAP ) hb_rddGetCurrentWorkAreaPointer();
聽 聽
聽 聽if( pArea )
聽 聽{
聽 聽 聽 LPDBORDERCONDINFO lpdbOrdCondInfo = pArea->lpdbOrdCondInfo;
聽 聽 聽 
聽 聽 聽 if( lpdbOrdCondInfo && lpdbOrdCondInfo->abWhile )
聽 聽 聽 聽 聽hb_retc( lpdbOrdCondInfo->abWhile );
聽 聽 聽 else
聽 聽 聽 聽 聽hb_retc( "" ); 聽 
聽 聽}
聽 聽else
聽 聽 聽 hb_retc( "" ); 聽 聽 
}

#pragma ENDDUMP

//----------------------------------------------------------------------------//
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: FiveDBU para 32/64 bits
Posted: Tue Jun 05, 2012 01:00 PM
Juan,

Comenzada la implementaci贸n de las relaciones:



Code (fw): Select all Collapse
#include "FiveWin.ch"
#include "xbrowse.ch"
#include "dbinfo.ch"

#ifdef __XHARBOUR__
   #define hb_CurDrive() CurDrive()
#endif   

#define GENBLOCK(x)  &( "{ || " + x + " }" )

REQUEST DBFCDX

static oWndMain, oMruDBFs, aSearches := {}

//----------------------------------------------------------------------------//

function Main( cDbfName )

   local oBar, oBmpTiled
   
   SET DATE FORMAT TO "DD/MM/YYYY"

   SetDlgGradient( { { 1, RGB( 199, 216, 237 ), RGB( 237, 242, 248 ) } } )

   DEFINE BITMAP oBmpTiled RESOURCE "background"

   DEFINE WINDOW oWndMain TITLE "FiveDBU" MDI MENU BuildMenu()

   DEFINE BUTTONBAR oBar OF oWndMain 2010 SIZE 70, 70
   
   DEFINE BUTTON OF oBar PROMPT "New" RESOURCE "new" ACTION New()

   DEFINE BUTTON OF oBar PROMPT "Open" RESOURCE "open" ACTION Open()

   DEFINE BUTTON OF oBar PROMPT "Copy" RESOURCE "copy" ACTION Copy() GROUP

   DEFINE BUTTON OF oBar PROMPT "Paste" RESOURCE "paste" ACTION Paste()

   DEFINE BUTTON OF oBar PROMPT "Prev" RESOURCE "prev" ;
      ACTION oWndMain:PrevWindow() GROUP WHEN Len( oWndMain:oWndClient:aWnd ) > 1

   DEFINE BUTTON OF oBar PROMPT "Next" RESOURCE "next" ;
      ACTION oWndMain:NextWindow() WHEN Len( oWndMain:oWndClient:aWnd ) > 1

   DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
      ACTION oWndMain:End() GROUP

   DEFINE MSGBAR PROMPT "FiveDBU 32/64 bits, (c) FiveTech Software 2012" ;
      OF oWndMain 2010 KEYBOARD DATE

   if ! Empty( cDbfName )
      Open( cDbfName )
   endif   

   ACTIVATE WINDOW oWndMain MAXIMIZED ;
      VALID MsgYesNo( "Want to end ?" ) ;
      ON PAINT DrawTiled( hDC, oWndMain, oBmpTiled )
   
   oBmpTiled:End()      

return nil

//----------------------------------------------------------------------------//

function BuildMenu()

   local oMenu
   
   MENU oMenu
      MENUITEM "Files"
      MENU
         MENUITEM "New..."
         MENUITEM "Open..." ACTION Open()
         SEPARATOR
         MENUITEM "Recent files"
         MENU
            MRU oMruDBFs ;
               FILENAME ".\FiveDBU.ini" ;    // .INI to manipulate. '\.' for local
               SECTION  "Recent DBF files" ; // The name of the INI section
               ACTION   Open( cMruItem ) ;   // cMruItem is automatically provided
               MESSAGE  "Open this file" ;   // The message for all of them
               SIZE     10
         ENDMENU       

         SEPARATOR
         MENUITEM "Exit" ACTION oWndMain:End()
      ENDMENU
      
      // oMenu:AddEdit()
      oMenu:AddMdi()
      oMenu:AddHelp( "FiveDBU", "(c) FiveTech Software 2012" )
   ENDMENU
   
return oMenu      

//----------------------------------------------------------------------------//

function Open( cFileName )

   local oWnd, oBar, oBrw, oMsgBar, oMsgDeleted, oMsgTagName
   local oPopup, cAlias, n, cClrBack, nTags
   
   DEFAULT cFileName := cGetFile( "*.dbf", "Please select a DBF" )
   
   if Empty( cFileName )
      return nil
   endif   
   
   if ! "." $ cFileName
      cFileName += ".dbf"
   endif   
   
   if ! File( cFileName )
      MsgStop( "File not found: " + cFileName )
      return nil
   endif
   
   if File( cFileNoExt( cFileName ) + ".ntx" )
      USE ( cFileName ) VIA "DBFNTX" NEW SHARED ;
         ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )
   else   
      USE ( cFileName ) VIA "DBFCDX" NEW SHARED ;
         ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )
      cAlias = Alias()
   endif        
   
   oMruDBFs:Save( cFileName )
   
   MENU oPopup POPUP
      MENUITEM "Natural order" ;
         ACTION ( ( cAlias )->( DbSetOrder( 0 ) ), oBrw:Refresh(), oBrw:SetFocus(),;
                  ( cAlias )->( Eval( oBrw:bChange ) ) )
      
      if ( nTags := ( cAlias )->( OrdTagsCount() ) ) > 0
         SEPARATOR
      endif   
      
      for n = 1 to nTags
         if ! Empty( OrdName( n ) )
            if ! Empty( OrdName( 1 ) )
               DbSetOrder( OrdName( 1 ) )
               DbGoTop()
            endif   
            MENUITEM OrdName( n ) ;
               ACTION ( ( cAlias )->( DbSetOrder( oMenuItem:cPrompt ) ),;
                        oBrw:Refresh(), ( cAlias )->( Eval( oBrw:bChange ) ), oBrw:SetFocus() )
         endif
      next    
   ENDMENU   
   
   DEFINE WINDOW oWnd TITLE "Browse " + cFileName MDICHILD

   oWnd:bCopy = { || MsgInfo( "copy" ) }

   DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70
   
   DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
      ACTION ( ( oBrw:cAlias )->( DbAppend() ), oBrw:Refresh(), oBrw:SetFocus() )

   DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
      ACTION ( oBrw:cAlias )->( Edit() )

   DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
      ACTION ( obrw:cAlias )->( DelRecord( oBrw, oMsgDeleted ) )

   DEFINE BUTTON OF oBar PROMPT "Search" RESOURCE "search" ;
      GROUP ACTION ( cAlias )->( Search( oBrw ) )

   DEFINE BUTTON OF oBar PROMPT "Index" RESOURCE "index" ;
      MENU oPopup ACTION ( cAlias )->( Indexes() )

   DEFINE BUTTON OF oBar PROMPT "Relations" RESOURCE "relation" ;
      ACTION ( cAlias )->( Relations() )

   DEFINE BUTTON OF oBar PROMPT "Top" RESOURCE "top" ;
      ACTION ( oBrw:GoTop(), oBrw:SetFocus() ) GROUP

   DEFINE BUTTON OF oBar PROMPT "Bottom" RESOURCE "bottom" ;
      ACTION ( oBrw:GoBottom(), oBrw:SetFocus() )

   DEFINE BUTTON OF oBar PROMPT "Struct" RESOURCE "struct" ;
      ACTION ( oBrw:cAlias )->( Struct() ) GROUP

   DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
      ACTION oBrw:Report()

   DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ACTION oWnd:End() GROUP

   @ 0, 0 XBROWSE oBrw OF oWnd LINES ;
      ON CHANGE ( oMsgBar:cMsgDef := "Alias: " + Alias() + ;
                                     " RecNo: " + AllTrim( Str( RecNo() ) ) + "/" + ;
                                     AllTrim( Str( RecCount() ) ),;
                                     oMsgBar:Refresh(),;
                                     oMsgTagName:SetText( "Ordered by: " + If( ! Empty( OrdName() ), OrdName(), "Natural order" ) ),;
                                     oMsgDeleted:SetText( If( ( oBrw:cAlias )->( Deleted() ),;
                                     "DELETED", "NON DELETED" ) ),;
                                     oMsgDeleted:SetBitmap( If( ( oBrw:cAlias )->( Deleted() ),;
                                     "deleted", "nondeleted" ) ) )

   oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW   
   oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
                         { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_BLACK ),;
                           RGB( 198, 255, 198 ) }, ;
                         { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_BLACK ),;
                           RGB( 232, 255, 232 ) } ) }
   oBrw:bClrSel = { || { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_WHITE ),;
                           RGB( 0x33, 0x66, 0xCC ) } }
   cClrBack = Eval( oBrw:bClrSelFocus )[ 2 ]                                              
   oBrw:bClrSelFocus = { || { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_WHITE ),;
                              cClrBack } }                      
   oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
   
   oBrw:CreateFromCode()
   oBrw:SetFocus()
   oBrw:bLDblClick = { || ( oBrw:cAlias )->( Edit() ) }                      
   
   oWnd:oClient = oBrw
   oWnd:oControl = oBrw

   DEFINE MSGBAR oMsgBar PROMPT "Alias: " + Alias() + " | RecNo: " + ;
      AllTrim( Str( RecNo() ) ) + "/" + ;
      AllTrim( Str( RecCount() ) ) ;
      OF oWnd 2010 

   DEFINE MSGITEM oMsgTagName OF oMsgBar ;
          PROMPT "Ordered by: " + ;
          If( ! Empty( ( oBrw:cAlias )->( OrdName() ) ),;
              ( oBrw:cAlias )->( OrdName() ), "Natural order" ) ;
          SIZE 150

   DEFINE MSGITEM oMsgDeleted OF oMsgBar ;
          PROMPT If( ( oBrw:cAlias )->( Deleted() ), "DELETED", "NON DELETED" ) ;
          SIZE 130 ;
          BITMAPS "nondeleted" ;
          ACTION ( oBrw:cAlias )->( DelRecord( oBrw, oMsgDeleted ) )   
          
   ACTIVATE WINDOW oWnd ;
      VALID ( ( cAlias )->( DbCloseArea() ), oBrw:cAlias := "", .T. )
   
return nil   

//----------------------------------------------------------------------------//

function Copy()

   if oWndMain:oWndActive != nil
      oWndMain:oWndActive:Copy()
   endif   

return nil

//----------------------------------------------------------------------------//
  
function DelField( aFields, cFieldName, oGet, oBrw )

   if Len( aFields ) >= 1
      ADel( aFields, oBrw:nArrayAt, .T. )
      oBrw:SetArray( aFields )
   endif

   oGet:VarPut( cFieldName := Space( 10 ) )
   oGet:SetPos( 0 )
   oGet:SetFocus()
   oBrw:GoBottom()
               
return nil

//----------------------------------------------------------------------------//
       
function DelRecord( oBrw, oMsgDeleted )

   if ! Deleted() 
      if ! MsgYesNo( "Want to delete this record ?" )
         return nil
      endif   
      DbRLock()   
      DbDelete()   
      DbUnlock()   
      oMsgDeleted:SetText( "DELETED" )
      oMsgDeleted:SetBitmap( "deleted" )
   else
      DbRLock()   
      DbRecall()   
      DbUnlock()         
      oMsgDeleted:SetText( "NON DELETED" )
      oMsgDeleted:SetBitmap( "nondeleted" )
      MsgInfo( "UnDeleted record" )
   endif
   
   Eval( oBrw:bChange )
   oBrw:Refresh()

return nil   

//----------------------------------------------------------------------------//
   
function Edit()

   local oWnd, aRecord := ( Alias() )->( LoadRecord() ), oBar, oBrw, oMsgBar
   local cAlias := Alias(), oBtnSave, nRecNo := ( Alias() )->( RecNo() )
   local oMsgDeleted
   
   DEFINE WINDOW oWnd TITLE "Edit " + Alias() MDICHILD

   oWndMain:oBar:AEvalWhen()

   DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70
   
   DEFINE BUTTON oBtnSave OF oBar PROMPT "Save" RESOURCE "save" ;
      ACTION ( ( cAlias )->( SaveRecord( aRecord, nRecNo ) ), oBtnSave:Disable() )

   oBtnSave:Disable()

   DEFINE BUTTON OF oBar PROMPT "Prev" RESOURCE "prev" ;
      ACTION GoPrevRecord( oBrw, aRecord, oMsgDeleted ) GROUP

   DEFINE BUTTON OF oBar PROMPT "Next" RESOURCE "next" ;
      ACTION GoNextRecord( oBrw, aRecord, oMsgDeleted ) 

   DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
      ACTION oBrw:Report() GROUP

   DEFINE BUTTON OF oBar PROMPT "View" RESOURCE "view" ;
      ACTION View( oBrw:aRow[ 2 ], oWnd )
      
   DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
      ACTION oWnd:End() GROUP

   @ 0, 0 XBROWSE oBrw OF oWnd ARRAY aRecord AUTOCOLS LINES ;
      HEADERS "FieldName", "Value" COLSIZES 150, 400 FASTEDIT ;
      ON CHANGE ( ( cAlias )->( SetEditType( oBrw, oBtnSave ) ), oBrw:DrawLine( .T. ),;
                  oMsgBar:cMsgDef := " RecNo: " + AllTrim( Str( ( cAlias )->( RecNo() ) ) ) + ;
                                 "/" + AllTrim( Str( ( cAlias )->( RecCount() ) ) ),;
                  oMsgBar:Refresh() )                 

   oBrw:nEditTypes = EDIT_GET
   oBrw:aCols[ 1 ]:nEditType = 0 // Don't allow to edit first column
   oBrw:aCols[ 2 ]:bOnChange = { || oBtnSave:Enable() }
   oBrw:aCols[ 2 ]:lWillShowABtn = .T.
   oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW   
   oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
                         { CLR_BLACK, RGB( 198, 255, 198 ) }, ;
                         { CLR_BLACK, RGB( 232, 255, 232 ) } ) }
   oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } }                      
   oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
   oBrw:CreateFromCode()
   oBrw:SetFocus()
   
   oWnd:oClient = oBrw

   DEFINE MSGBAR oMsgBar ;
      PROMPT " RecNo: " + AllTrim( Str( ( cAlias )->( RecNo() ) ) ) + "/" + ;
      AllTrim( Str( ( cAlias )->( RecCount() ) ) ) OF oWnd 2010

   DEFINE MSGITEM oMsgDeleted OF oMsgBar ;
          PROMPT If( ( cAlias )->( Deleted() ), "DELETED", "NON DELETED" ) ;
          SIZE 130 ;
          BITMAPS If( ( cAlias )->( Deleted() ), "deleted", "nondeleted" ) ;
          ACTION ( cAlias )->( DelRecord( oBrw, oMsgDeleted ) )   
   
   ACTIVATE WINDOW oWnd
   
return nil      

//----------------------------------------------------------------------------//

function GoPrevRecord( oBrw, aRecord, oMsgDeleted )

   DbSkip( -1 )
   
   oBrw:SetArray( aRecord := LoadRecord() )
   oBrw:SetFocus()
   Eval( oBrw:bChange )

   oMsgDeleted:SetText( If( Deleted(), "DELETED", "NON DELETED" ) )
   oMsgDeleted:SetBitmap( If( Deleted(), "deleted", "nondeleted" ) )
   
return nil

//----------------------------------------------------------------------------//

function GoNextRecord( oBrw, aRecord, oMsgDeleted )

   DbSkip( 1 )
   
   If Eof()
      DbSkip( -1 )
   else
      oBrw:SetArray( aRecord := LoadRecord() )
      oBrw:SetFocus()
      Eval( oBrw:bChange )
   endif   

   oMsgDeleted:SetText( If( Deleted(), "DELETED", "NON DELETED" ) )
   oMsgDeleted:SetBitmap( If( Deleted(), "deleted", "nondeleted" ) )
   
return nil

//----------------------------------------------------------------------------//

function SetEditType( oBrw, oBtnSave )

   local cType := FieldType( oBrw:nArrayAt )
   
   do case
      case cType == "M"
           oBrw:aCols[ 2 ]:nEditType = EDIT_BUTTON
           oBrw:aCols[ 2 ]:bEditBlock = { | c | c := oBrw:aRow[ 2 ],;
                                               MemoEdit( @oBrw:aRow[ 2 ], FieldName( oBrw:nArrayAt ) ),;
                                               If( ! c == oBrw:aRow[ 2 ], oBtnSave:Enable(),),;
                                               oBrw:aRow[ 2 ] }
   
      case cType == "D"
           oBrw:aCols[ 2 ]:nEditType = EDIT_BUTTON
           oBrw:aCols[ 2 ]:bEditBlock = { || If( ! Empty( oBrw:aRow[ 2 ] ) .and. ;
                                                 ! AllTrim( oBrw:aRow[ 2 ] ) == "/  /",;
                                             DToC( MsgDate( CtoD( oBrw:aRow[ 2 ] ) ) ),;
                                             DToC( MsgDate( Date() ) ) ) }
   
      case cType == "L"
           oBrw:aCols[ 2 ]:nEditType = EDIT_LISTBOX
           oBrw:aCols[ 2 ]:aEditListTxt   = { ".T.", ".F." }
           
      otherwise
           oBrw:aCols[ 2 ]:nEditType = EDIT_GET
   endcase
   
return nil              

//----------------------------------------------------------------------------//

function IndexBuilder()

   local oDlg, cExp := Space( 80 ), cTo := Space( 80 ), cTag := Space( 20 )
   local cFor := Space( 80 ), cWhile := Space( 80 ), lUnique := .F.
   local lDescend := .F., lMemory := .F., cScope := "All", nRecNo
   local oPgr, nMeter := 0, nStep := 10, lTag := .T. 
   
   DEFINE DIALOG oDlg TITLE "Index builder" SIZE 530, 380 

   @ 0.4, 3 SAY "Expression:" OF oDlg SIZE 40, 8

   @ 0.5, 6 GET cExp OF oDlg SIZE 200, 11 ACTION ExpBuilder( @cExp ) ;
      VALID ! Empty( cExp )
   
   @ 1.5, 6 SAY "To:" OF oDlg SIZE 40, 8

   @ 1.7, 6 GET cTo OF oDlg SIZE 200, 11

   @ 2.6, 5.5 SAY "Tag:" OF oDlg SIZE 40, 8

   @   3, 6 GET cTag OF oDlg SIZE 100, 11
   
   @ 3.7, 5.9 SAY "For:" OF oDlg SIZE 40, 8

   @ 4.3, 6 GET cFor OF oDlg SIZE 200, 11 ACTION ExpBuilder()

   @ 4.8, 5 SAY "While:" OF oDlg SIZE 40, 8

   @ 5.6, 6 GET cWhile OF oDlg SIZE 200, 11 ACTION ExpBuilder()
   
   @ 6.8, 6.9 CHECKBOX lUnique PROMPT "&Unique" OF oDlg SIZE 50, 8

   @ 6.8, 13.9 CHECKBOX lDescend PROMPT "&Descending" OF oDlg SIZE 80, 8

   @ 6.8, 23 CHECKBOX lMemory PROMPT "&Memory" OF oDlg SIZE 80, 8

   @ 6.8, 8 SAY "Scope:" OF oDlg SIZE 40, 8
   
   @ 8.2, 6 COMBOBOX cScope ITEMS { "All", "Next", "Record", "Rest" } OF oDlg

   @ 6.8, 16.1 SAY "Record:" OF oDlg SIZE 40, 8

   @ 8.8, 12.1 GET nRecNo OF oDlg SIZE 30, 11

   @ 8.5, 8 SAY "Progress:" OF oDlg SIZE 40, 8
   
   @ 9.2, 8 PROGRESS oPgr OF oDlg SIZE 200, 10
   
   @ 9.2, 13 BUTTON "C&reate" OF oDlg SIZE 45, 13 ;
      ACTION ( OrdCondSet( If( ! Empty( cFor ), cFor,),;
                           If( ! Empty( cFor ), GENBLOCK( cFor ),),;
                           If( cScope == "All", .T.,),;
                           If( ! Empty( cWhile ), GENBLOCK( cWhile ),),;
                           { || nMeter += nStep, oPgr:SetPos( nMeter ), SysRefresh() },;
                           nStep, Recno(),;
                           If( cScope == "Next", nRecNo,),;
                           If( cScope == "Record", nRecNo,),;
                           If( cScope == "Rest", .T.,),;
                           If( lDescend, .T.,),;
                           lTag,, .F., .F., .F., .T., .F., .F. ),;
               OrdCreate( OrdBagName(), If( lTag, cTag,), cExp, GENBLOCK( cExp ),;
                          If( lUnique, .T.,) ), oDlg:End() )                                      

   @ 9.2, 24 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End() CANCEL
   
   ACTIVATE DIALOG oDlg CENTERED

return nil

//----------------------------------------------------------------------------//

function Indexes()

   local oWnd, oBar, oBrw, oMsgBar
   local cAlias := Alias(), aIndexes := {}, n 
   
   for n = 1 to 15
      if ! Empty( OrdName( n ) )
         AAdd( aIndexes, { n,;
                           OrdName( n ),;
                           OrdKey( n ),;
                           OrdFor( n ),;
                           OrdBagName( n ),;
                           OrdBagExt( n ) } )
      endif   
   next    
   
   DEFINE WINDOW oWnd TITLE "Indexes of " + Alias() MDICHILD

   oWndMain:oBar:AEvalWhen()

   DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70

   DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
      ACTION ( IndexBuilder(), oBrw:Refresh(), oBrw:SetFocus() )

   DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
      ACTION ( MsgInfo( "Edit" ) )

   DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
      ACTION If( MsgYesNo( "Want to delete this tag ?" ),;
                ( ( cAlias )->( OrdBagClear( oBrw:nArrayAt ) ), oBrw:Refresh() ),)

   DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
      ACTION oBrw:Report() GROUP
   
   DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
      ACTION oWnd:End() GROUP

   @ 0, 0 XBROWSE oBrw OF oWnd ARRAY aIndexes AUTOCOLS LINES ;
      HEADERS "Order", "TagName", "Expression", "For", "BagName", "BagExt" ;
      COLSIZES 50, 150, 400, 400, 150, 150

   oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW   
   oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
                         { CLR_BLACK, RGB( 198, 255, 198 ) }, ;
                         { CLR_BLACK, RGB( 232, 255, 232 ) } ) }
   oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } }                      
   oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
   oBrw:CreateFromCode()
   oBrw:SetFocus()
   
   oWnd:oClient = oBrw

   DEFINE MSGBAR oMsgBar 2010
   
   ACTIVATE WINDOW oWnd 

return nil

//----------------------------------------------------------------------------//

function ExpBuilder( cExp )

   local oDlg, oBrw, aFields := DBStruct()
   local oExp, cFunction
   
   cExp = RTrim( cExp )
   
   DEFINE DIALOG oDlg TITLE "Expression builder" SIZE 480, 450
   
   @ 0.2, 1.5 SAY "Expression:" SIZE 80, 11 OF oDlg
   
   @ 1.1, 1 GET oExp VAR cExp MEMO SIZE 221, 27
   
   @ 3, 1.5 SAY "Fields" OF oDlg SIZE 40, 10
   
   @ 4, 1 XBROWSE oBrw ARRAY aFields AUTOCOLS LINES SIZE 120, 120 ;
      HEADERS "Name", "Type", "Len", "Dec" ;
      COLSIZES 95, 30, 30, 30 
      
   oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW   
   oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
                         { CLR_BLACK, RGB( 198, 255, 198 ) }, ;
                         { CLR_BLACK, RGB( 232, 255, 232 ) } ) }
   oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } }                      
   oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
   oBrw:CreateFromCode()
   oBrw:bLDblClick = { || cExp += oBrw:aRow[ 1 ], oExp:Refresh() } 

   @ 3, 23.1 SAY "Operators" OF oDlg SIZE 40, 10

   @ 3.1, 23 BUTTON "=" OF oDlg SIZE 15, 15 ACTION ( cExp += " = ", oExp:Refresh() )

   @ 3.1, 26.2 BUTTON "<>" OF oDlg SIZE 15, 15 ACTION ( cExp += " <> ", oExp:Refresh() )

   @ 3.1, 29.4 BUTTON "+" OF oDlg SIZE 15, 15 ACTION ( cExp += " + ", oExp:Refresh() )

   @ 3.1, 32.6 BUTTON "(" OF oDlg SIZE 15, 15 ACTION ( cExp += " ( ", oExp:Refresh() )

   @ 3.1, 35.8 BUTTON ".T." OF oDlg SIZE 15, 15 ACTION ( cExp += " .T. ", oExp:Refresh() )

   @ 4.1, 23 BUTTON "<" OF oDlg SIZE 15, 15 ACTION ( cExp += " < ", oExp:Refresh() )

   @ 4.1, 26.2 BUTTON ">" OF oDlg SIZE 15, 15 ACTION ( cExp += " > ", oExp:Refresh() )

   @ 4.1, 29.4 BUTTON "-" OF oDlg SIZE 15, 15 ACTION ( cExp += " - ", oExp:Refresh() )

   @ 4.1, 32.6 BUTTON ")" OF oDlg SIZE 15, 15 ACTION ( cExp += " )", oExp:Refresh() )

   @ 4.1, 35.8 BUTTON ".F." OF oDlg SIZE 15, 15 ACTION ( cExp += " .F. ", oExp:Refresh() )

   @ 5.1, 23 BUTTON "<=" OF oDlg SIZE 15, 15 ACTION ( cExp += " <= ", oExp:Refresh() )

   @ 5.1, 26.2 BUTTON ">=" OF oDlg SIZE 15, 15 ACTION ( cExp += " >= ", oExp:Refresh() )

   @ 5.1, 29.4 BUTTON "*" OF oDlg SIZE 15, 15 ACTION ( cExp += " * ", oExp:Refresh() )

   @ 5.1, 32.6 BUTTON "/" OF oDlg SIZE 15, 15 ACTION ( cExp += " / ", oExp:Refresh() )

   @ 5.1, 35.8 BUTTON "$" OF oDlg SIZE 15, 15 ACTION ( cExp += " $ ", oExp:Refresh() )

   @ 6.1, 23 BUTTON '"' OF oDlg SIZE 15, 15 ACTION ( cExp += '"', oExp:Refresh() )

   @ 6.1, 26.2 BUTTON "!" OF oDlg SIZE 15, 15 ACTION ( cExp += " ! ", oExp:Refresh() )

   @ 6.1, 29.4 BUTTON "SP" OF oDlg SIZE 15, 15 ACTION ( cExp += " ", oExp:Refresh() )

   @ 6.1, 32.6 BUTTON "," OF oDlg SIZE 15, 15 ACTION ( cExp += ", ", oExp:Refresh() )

   @ 6.1, 35.8 BUTTON ":" OF oDlg SIZE 15, 15 ACTION ( cExp += " : ", oExp:Refresh() )

   @ 7.1, 23 BUTTON "AND" OF oDlg SIZE 27, 15 ACTION ( cExp += " .and. ", oExp:Refresh() )

   @ 7.1, 28.4 BUTTON "OR" OF oDlg SIZE 27, 15 ACTION ( cExp += " .or. ", oExp:Refresh() )

   @ 7.1, 33.7 BUTTON "NOT" OF oDlg SIZE 27, 15 ACTION ( cExp += " ! ", oExp:Refresh() )

   @ 10.3, 23.2 SAY "Functions" OF oDlg SIZE 84, 11

   @ 11.9, 17.3 COMBOBOX cFunction ITEMS { "AllTrim()", "Left()", "Right()", "SubStr()" } ;
      OF oDlg SIZE 92, 80 ON CHANGE ( cExp += Left( cFunction, Len( cFunction ) - 1 ) + " ",;
                                      oExp:Refresh() )

   @ 11, 13 BUTTON "&Ok" OF oDlg SIZE 45, 13 ACTION oDlg:End()

   @ 11, 24 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End() CANCEL
           
   ACTIVATE DIALOG oDlg CENTERED

return cExp

//----------------------------------------------------------------------------//

function LoadRecord()

   local aRecord := {}, n
   
   for n = 1 to FCount()
      AAdd( aRecord, { FieldName( n ), FieldGet( n ) } )
   next
   
return aRecord      
   
//----------------------------------------------------------------------------// 

function Search( oBrw )

   local oDlg, oCbx, cSearch := Space( 50 )
   local nRecNo := RecNo(), lInc := .T.
   
   DEFINE DIALOG oDlg TITLE "Search: " + Alias() SIZE 400, 200
   
   @ 0.5, 1.5 SAY "Ordered by: " + OrdName() OF oDlg
   
   @ 1.2, 1.5 SAY "Key: " + OrdKey() OF oDlg
   
   @ 2.4, 1.2 COMBOBOX oCbx VAR cSearch ITEMS aSearches OF oDlg SIZE 180, 150 ;
     STYLE CBS_DROPDOWN
   
   oCbx:oGet:bChange = { || DbSeek( AllTrim( oCbx:GetText() ), lInc ), oBrw:Refresh() } 
   
   @ 3.7, 1.5 CHECKBOX lInc PROMPT "&Incremental" OF oDlg SIZE 80, 10
   
   @ 4, 7 BUTTON "&Ok" OF oDlg SIZE 45, 13 ;
      ACTION ( If( ! DbSeek( AllTrim( cSearch ), lInc ), DbGoTo( nRecNo ),),;
               AAdd( aSearches, AllTrim( cSearch ) ), oDlg:End() )

   @ 4, 18 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End()
   
   ACTIVATE DIALOG oDlg CENTERED
   
return nil   

//----------------------------------------------------------------------------// 

function Relations()

   local oWnd, oBar, oBrw, aRelations := { { "", "", "", "" } }, n
   
   for n = 1 to DbInfo( DBI_CHILDCOUNT )
      AAdd( aRelations, { "exp", "child", ".F.", ".F." } )
   next   
   
   DEFINE WINDOW oWnd TITLE "Relations of " + Alias() MDICHILD

   oWndMain:oBar:AEvalWhen()

   DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70

   DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
      ACTION MsgInfo( "Add" )

   DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
      ACTION ( MsgInfo( "Edit" ) )

   DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
      ACTION MsgInfo( "del" )

   DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
      ACTION oBrw:Report() GROUP
   
   DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
      ACTION oWnd:End() GROUP

   @ 0, 0 XBROWSE oBrw OF oWnd ARRAY aRelations AUTOCOLS LINES ;
      HEADERS "Expression", "Child Alias", "Additive", "Scoped" ;
      COLSIZES 150, 400, 100, 100

   oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW   
   oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
                         { CLR_BLACK, RGB( 198, 255, 198 ) }, ;
                         { CLR_BLACK, RGB( 232, 255, 232 ) } ) }
   oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } }                      
   oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
   oBrw:CreateFromCode()
   oBrw:SetFocus()
   
   oWnd:oClient = oBrw

   DEFINE MSGBAR oMsgBar 2010

   ACTIVATE WINDOW oWnd

return nil

//----------------------------------------------------------------------------// 

function SaveRecord( aRecord, nRecNo )

   local n

   ( Alias() )->( DbGoTo( nRecNo ) )
   
   if ( Alias() )->( DbRLock( nRecNo ) )
      for n = 1 to Len( aRecord )
         ( Alias() )->( FieldPut( n, aRecord[ n ][ 2 ] ) )
      next
      ( Alias() )->( DbUnLock() )
      MsgInfo( "Record updated" )
   else
      MsgAlert( "Record in use, please try it again" )
   endif         

return nil      

//----------------------------------------------------------------------------// 

function Struct()

   local oDlg, oBrw, aFields := DbStruct()
   
   DEFINE DIALOG oDlg TITLE Alias() + " fields" SIZE 400, 400

   @ 0, 0 XBROWSE oBrw ARRAY aFields AUTOCOLS LINES ;
      HEADERS "Name", "Type", "Len", "Dec" ;
      COLSIZES 150, 50, 80, 80

   oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW   
   oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
                         { CLR_BLACK, RGB( 198, 255, 198 ) }, ;
                         { CLR_BLACK, RGB( 232, 255, 232 ) } ) }
   oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } }                      
   oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
   
   oBrw:CreateFromCode()
      
   oDlg:oClient = oBrw
   
   ACTIVATE DIALOG oDlg CENTERED ;
      ON INIT ( BuildStructBar( oDlg, oBrw ), oDlg:Resize(), oBrw:SetFocus() )
   
return nil   

//----------------------------------------------------------------------------// 

function BuildStructBar( oDlg, oBrw )

   local oBar

   DEFINE BUTTONBAR oBar OF oDlg 2010 SIZE 70, 70
   
   DEFINE BUTTON OF oBar PROMPT "Code" RESOURCE "code" ;
      ACTION ( TxtStruct(), oBrw:SetFocus() )

   DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
      ACTION oDlg:End() GROUP

return nil

//----------------------------------------------------------------------------// 

function TxtStruct()

   local cCode := "local aFields := { ", n
   
   for n = 1 to FCount()
      if n > 1
         cCode += Space( 27 )
      endif   
      cCode += '{ "' + FieldName( n ) + '", "' + ;
               FieldType( n ) + '", ' + ;
               AllTrim( Str( FieldLen( n ) ) ) + ", " + ;
               AllTrim( Str( FieldDec( n ) ) ) + " },;" + CRLF
   next
   
   cCode = SubStr( cCode, 1, Len( cCode ) - 4 ) + " }"
   
   MemoEdit( cCode, "Code" )

return nil

//----------------------------------------------------------------------------//   

function View( cFileName, oWnd )

   local cExt := Lower( cFileExt( cFileName ) )
   
   do case
      case cExt == "bmp"
           WinExec( "mspaint" + " " + cFileName )
           
      case cExt == "txt"
           WinExec( "notepad" + " " + cFileName )     
           
      otherwise
           ShellExecute( oWnd:hWnd, "Open", cFileName )
   endcase
   
return nil                

//----------------------------------------------------------------------------//   

function New()

   local oDlg, oGet, oBrw, oBtn
   local cFieldName := Space( 10 ), cType := "Character", nLen := 10, nDec := 0
   local aFields := { Array( 4 ) }, cDbfName := Space( 8 ), aTemp
   local oLen, oDec, aType := { "Character", "Number", "Date", "Logical", "Memo" }
   local bChange := {|| If( cType == "Character", (nLen := 10, nDec := 0, oDec:Disable() ),),;
                        If( cType == "Number",    (nLen := 10, nDec := 0, oDec:Enable()  ),),;
                        If( cType == "Date",      (nLen := 8,  nDec := 0, oDec:Disable() ),),;
                        If( cType == "Logical",   (nLen := 1,  nDec := 0, oDec:Disable() ),),;
                        If( cType == "Memo",      (nLen := 10, nDec := 0, oDec:Disable() ),),;
                        oDlg:Update() }
   local bEdit := {|| IF ( !Empty (aFields[1,1]) ,;
                      (oBtn:Enable (),;
                       cFieldName := aFields[oBrw:nArrayAt,1] ,;
                       cType := aFields[oBrw:nArrayAt,2] ,;
                       cType := aType[ aScan(aType, {|x| Left(x,1) = cType} )],;
                       Eval (bChange) ,;
                       nLen := aFields[oBrw:nArrayAt,3] ,;
                       nDec := aFields[oBrw:nArrayAt,4] ,;
                       oGet:SetPos( 0 ),;
                       oGet:SetFocus(),;
                       oDlg:Update() ) ,) ;
                     }
   local bSave := {|| oBtn:Disable (),;
                      aFields[oBrw:nArrayAt,1] := cFieldname,;
                      aFields[oBrw:nArrayAt,2] := Left (cType,1),;
                      aFields[oBrw:nArrayAt,3] := nLen,;
                      aFields[oBrw:nArrayAt,4] := nDec,;
                      oBrw:SetArray (aFields),;
                      cFieldName := Space( 10 ),;
                      Eval (bChange) ,;
                      oDlg:Update() ,;
                      oGet:SetPos( 0 ),;
                      oGet:SetFocus(),;
                      oBrw:GoBottom();
                      }

   DEFINE DIALOG oDlg TITLE "DBF builder" SIZE 415, 400

   @ 0.5,  2 SAY "Field Name" OF oDlg SIZE 40, 8
   @ 0.5, 10 SAY "Type" OF oDlg SIZE 40, 8
   @ 0.5, 17 SAY "Len" OF oDlg SIZE 40, 8
   @ 0.5, 22 SAY "Dec" OF oDlg SIZE 20, 8

   @ 1.4, 1 GET oGet VAR cFieldName PICTURE "!!!!!!!!!!" OF oDlg SIZE 41, 11 UPDATE

   @ 1.3, 6.5 COMBOBOX cType ITEMS aType ;
      OF oDlg ON CHANGE Eval (bChange) UPDATE

   @ 1.4, 11.9 GET oLen VAR nLen PICTURE "999" OF oDlg SIZE 25, 11 UPDATE

   @ 1.4, 15.4 GET oDec VAR nDec PICTURE "999" OF oDlg SIZE 25, 11 UPDATE

   @ 0.9, 26 BUTTON "&Add" OF oDlg SIZE 45, 13 ;
      ACTION AddField( @aFields, @cFieldName, @cType, @nLen, @nDec, oGet, oBrw )

   @ 2.4, 26 BUTTON oBtn PROMPT "&Edit" OF oDlg SIZE 45, 13 ;
     ACTION Eval (bSave)

   @ 3.4, 26 BUTTON "&Delete" OF oDlg SIZE 45, 13 ;
     ACTION DelField (@aFields, @cFieldName, oGet, oBrw)

   @ 4.4, 26 BUTTON "Move &Up" OF oDlg SIZE 45, 13 ;
      ACTION If( oBrw:nArrayAt > 1,;
                 ( aTemp := aFields[ oBrw:nArrayAt ],;
                   aFields[ oBrw:nArrayAt ] := aFields[ oBrw:nArrayAt - 1 ],;
                   aFields[ oBrw:nArrayAt - 1 ] := aTemp,;
                   oBrw:GoUp() ),)

   @ 5.4, 26 BUTTON "Move D&own" OF oDlg SIZE 45, 13 ;
      ACTION If( oBrw:nArrayAt < Len( aFields ),;
                 ( aTemp := aFields[ oBrw:nArrayAt ],;
                   aFields[ oBrw:nArrayAt ] := aFields[ oBrw:nArrayAt + 1 ],;
                   aFields[ oBrw:nArrayAt + 1 ] := aTemp,;
                   oBrw:GoDown() ),)

   @ 6.4, 26 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End()

   @ 2.2, 2 SAY "Fields" OF oDlg SIZE 40, 8

   @ 3.2, 1 XBROWSE oBrw ARRAY aFields AUTOCOLS ;
      HEADERS "Name", "Type", "Len", "Dec" ;
      COLSIZES 90, 55, 40, 40 ;
      SIZE 140, 130 OF oDlg ;
      ON DBLCLICK Eval (bEdit)

   oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW
   oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
                         { CLR_BLACK, RGB( 198, 255, 198 ) }, ;
                         { CLR_BLACK, RGB( 232, 255, 232 ) } ) }
   oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } }
   oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
   oBrw:CreateFromCode()

   @ 12.1, 2 SAY "DBF Name:" OF oDlg SIZE 30, 8

   @ 14, 6 GET cDbfName PICTURE "!!!!!!!!!!!!" OF oDlg SIZE 100, 11

   @ 10, 26 BUTTON "&Create" OF oDlg SIZE 45, 13 ;
      ACTION ( If( ! Empty( cDbfName ) .and. Len( aFields ) > 0,;
          DbCreate( AllTrim( cDbfName ), aFields ),), oDlg:End(),;
          Open( hb_CurDrive() + ":\" + CurDir() + "\" + AllTrim( cDbfName ) ) )

   ACTIVATE DIALOG oDlg CENTERED ON INIT (Eval (bChange), oBtn:Disable() ) ;
                                 VALID !GETKEYSTATE( VK_ESCAPE )

return nil

//----------------------------------------------------------------------------//

function AddField( aFields, cFieldName, cType, nLen, nDec, oGet, oBrw )

   if Empty( cFieldName )
      oGet:SetPos( 0 )
      return nil
   endif

   if Len( aFields ) == 1 .and. Empty( aFields[ 1 ][ 1 ] )
      aFields = { { cFieldName, Upper( Left( cType, 1 ) ), nLen, nDec } }
   else
      AAdd( aFields, { cFieldName, Upper( Left( cType, 1 ) ), nLen, nDec } )
   endif

   oBrw:SetArray( aFields )
   oGet:VarPut( cFieldName := Space( 10 ) )
   oGet:SetPos( 0 )
   oGet:SetFocus()
   oBrw:GoBottom()

return nil
        
//----------------------------------------------------------------------------//

function OrdTagsCount()

   local n, nCount := 0
   
   for n = 1 to 100
      if ! Empty( OrdName( n ) )
         nCount++
      endif   
   next
   
return nCount   
   
//----------------------------------------------------------------------------//  

function Paste()

   if oWndMain:oWndActive != nil
      oWndMain:oWndActive:Paste()
   endif   

return nil

//----------------------------------------------------------------------------//  

#pragma BEGINDUMP

#include <hbapi.h>
#include <hbapirdd.h>

HB_FUNC( ORDCONDGET )
{
   AREAP pArea = ( AREAP ) hb_rddGetCurrentWorkAreaPointer();
   
   if( pArea )
   {
      LPDBORDERCONDINFO lpdbOrdCondInfo = pArea->lpdbOrdCondInfo;
      
      if( lpdbOrdCondInfo && lpdbOrdCondInfo->abWhile )
         hb_retc( lpdbOrdCondInfo->abWhile );
      else
         hb_retc( "" );   
   }
   else
      hb_retc( "" );     
}

#pragma ENDDUMP

//----------------------------------------------------------------------------//
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
Re: FiveDBU para 32/64 bits
Posted: Tue Jun 05, 2012 04:01 PM

Hola antonio, he probado poniendo la linea.

REQUEST ADS

pero no funciona,

el problema esta en el USE .... VIA

//USE ( cFileName ) VIA "DBFCDX" NEW SHARED ;
// ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )

al poner en uso solo funciona con DBFCDX o NTX

saludos

Cesar Cortes Cruz

SysCtrl Software

Mexico



' Sin +- FWH es mejor "
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: FiveDBU para 32/64 bits
Posted: Tue Jun 05, 2012 04:05 PM

C茅sar,

Modifica esas lineas para forzarle a usar ADS y comprueba como se comporta, gracias :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: FiveDBU para 32/64 bits
Posted: Tue Jun 05, 2012 04:06 PM
Versi贸n mejorada para revisar los 铆ndices y las relaciones:

Code (fw): Select all Collapse
#include "FiveWin.ch"
#include "xbrowse.ch"
#include "dbinfo.ch"

#ifdef __XHARBOUR__
聽 聽#define hb_CurDrive() CurDrive()
#endif 聽 

#define GENBLOCK(x) 聽&( "{ || " + x + " }" )

REQUEST DBFCDX

static oWndMain, oMruDBFs, aSearches := {}

//----------------------------------------------------------------------------//

function Main( cDbfName )

聽 聽local oBar, oBmpTiled
聽 聽
聽 聽SET DATE FORMAT TO "DD/MM/YYYY"

聽 聽SetDlgGradient( { { 1, RGB( 199, 216, 237 ), RGB( 237, 242, 248 ) } } )

聽 聽DEFINE BITMAP oBmpTiled RESOURCE "background"

聽 聽DEFINE WINDOW oWndMain TITLE "FiveDBU" MDI MENU BuildMenu()

聽 聽DEFINE BUTTONBAR oBar OF oWndMain 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "New" RESOURCE "new" ACTION New()

聽 聽DEFINE BUTTON OF oBar PROMPT "Open" RESOURCE "open" ACTION Open()

聽 聽DEFINE BUTTON OF oBar PROMPT "Copy" RESOURCE "copy" ACTION Copy() GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Paste" RESOURCE "paste" ACTION Paste()

聽 聽DEFINE BUTTON OF oBar PROMPT "Prev" RESOURCE "prev" ;
聽 聽 聽 ACTION oWndMain:PrevWindow() GROUP WHEN Len( oWndMain:oWndClient:aWnd ) > 1

聽 聽DEFINE BUTTON OF oBar PROMPT "Next" RESOURCE "next" ;
聽 聽 聽 ACTION oWndMain:NextWindow() WHEN Len( oWndMain:oWndClient:aWnd ) > 1

聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWndMain:End() GROUP

聽 聽DEFINE MSGBAR PROMPT "FiveDBU 32/64 bits, (c) FiveTech Software 2012" ;
聽 聽 聽 OF oWndMain 2010 KEYBOARD DATE

聽 聽if ! Empty( cDbfName )
聽 聽 聽 Open( cDbfName )
聽 聽endif 聽 

聽 聽ACTIVATE WINDOW oWndMain MAXIMIZED ;
聽 聽 聽 VALID MsgYesNo( "Want to end ?" ) ;
聽 聽 聽 ON PAINT DrawTiled( hDC, oWndMain, oBmpTiled )
聽 聽
聽 聽oBmpTiled:End() 聽 聽 聽

return nil

//----------------------------------------------------------------------------//

function BuildMenu()

聽 聽local oMenu
聽 聽
聽 聽MENU oMenu
聽 聽 聽 MENUITEM "Files"
聽 聽 聽 MENU
聽 聽 聽 聽 聽MENUITEM "New..."
聽 聽 聽 聽 聽MENUITEM "Open..." ACTION Open()
聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 聽 聽MENUITEM "Recent files"
聽 聽 聽 聽 聽MENU
聽 聽 聽 聽 聽 聽 MRU oMruDBFs ;
聽 聽 聽 聽 聽 聽 聽 聽FILENAME ".\FiveDBU.ini" ; 聽 聽// .INI to manipulate. '\.' for local
聽 聽 聽 聽 聽 聽 聽 聽SECTION 聽"Recent DBF files" ; // The name of the INI section
聽 聽 聽 聽 聽 聽 聽 聽ACTION 聽 Open( cMruItem ) ; 聽 // cMruItem is automatically provided
聽 聽 聽 聽 聽 聽 聽 聽MESSAGE 聽"Open this file" ; 聽 // The message for all of them
聽 聽 聽 聽 聽 聽 聽 聽SIZE 聽 聽 10
聽 聽 聽 聽 聽ENDMENU 聽 聽 聽 

聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 聽 聽MENUITEM "Exit" ACTION oWndMain:End()
聽 聽 聽 ENDMENU
聽 聽 聽 
聽 聽 聽 // oMenu:AddEdit()
聽 聽 聽 oMenu:AddMdi()
聽 聽 聽 oMenu:AddHelp( "FiveDBU", "(c) FiveTech Software 2012" )
聽 聽ENDMENU
聽 聽
return oMenu 聽 聽 聽

//----------------------------------------------------------------------------//

function Open( cFileName )

聽 聽local oWnd, oBar, oBrw, oMsgBar, oMsgDeleted, oMsgTagName
聽 聽local oPopup, cAlias, n, cClrBack, nTags
聽 聽
聽 聽DEFAULT cFileName := cGetFile( "*.dbf", "Please select a DBF" )
聽 聽
聽 聽if Empty( cFileName )
聽 聽 聽 return nil
聽 聽endif 聽 
聽 聽
聽 聽if ! "." $ cFileName
聽 聽 聽 cFileName += ".dbf"
聽 聽endif 聽 
聽 聽
聽 聽if ! File( cFileName )
聽 聽 聽 MsgStop( "File not found: " + cFileName )
聽 聽 聽 return nil
聽 聽endif
聽 聽
聽 聽if File( cFileNoExt( cFileName ) + ".ntx" )
聽 聽 聽 USE ( cFileName ) VIA "DBFNTX" NEW SHARED ;
聽 聽 聽 聽 聽ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )
聽 聽else 聽 
聽 聽 聽 USE ( cFileName ) VIA "DBFCDX" NEW SHARED ;
聽 聽 聽 聽 聽ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )
聽 聽 聽 cAlias = Alias()
聽 聽endif 聽 聽 聽 聽
聽 聽
聽 聽oMruDBFs:Save( cFileName )
聽 聽
聽 聽MENU oPopup POPUP
聽 聽 聽 MENUITEM "Natural order" ;
聽 聽 聽 聽 聽ACTION ( ( cAlias )->( DbSetOrder( 0 ) ), oBrw:Refresh(), oBrw:SetFocus(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 ( cAlias )->( Eval( oBrw:bChange ) ) )
聽 聽 聽 
聽 聽 聽 if ( nTags := ( cAlias )->( OrdTagsCount() ) ) > 0
聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 endif 聽 
聽 聽 聽 
聽 聽 聽 for n = 1 to nTags
聽 聽 聽 聽 聽if ! Empty( OrdName( n ) )
聽 聽 聽 聽 聽 聽 if ! Empty( OrdName( 1 ) )
聽 聽 聽 聽 聽 聽 聽 聽DbSetOrder( OrdName( 1 ) )
聽 聽 聽 聽 聽 聽 聽 聽DbGoTop()
聽 聽 聽 聽 聽 聽 endif 聽 
聽 聽 聽 聽 聽 聽 MENUITEM OrdName( n ) ;
聽 聽 聽 聽 聽 聽 聽 聽ACTION ( ( cAlias )->( DbSetOrder( oMenuItem:cPrompt ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oBrw:Refresh(), ( cAlias )->( Eval( oBrw:bChange ) ), oBrw:SetFocus() )
聽 聽 聽 聽 聽endif
聽 聽 聽 next 聽 聽
聽 聽ENDMENU 聽 
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Browse " + cFileName MDICHILD

聽 聽oWnd:bCopy = { || MsgInfo( "copy" ) }

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
聽 聽 聽 ACTION ( ( oBrw:cAlias )->( DbAppend() ), oBrw:Refresh(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
聽 聽 聽 ACTION ( oBrw:cAlias )->( Edit() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
聽 聽 聽 ACTION ( obrw:cAlias )->( DelRecord( oBrw, oMsgDeleted ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Search" RESOURCE "search" ;
聽 聽 聽 GROUP ACTION ( cAlias )->( Search( oBrw ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Index" RESOURCE "index" ;
聽 聽 聽 MENU oPopup ACTION ( cAlias )->( Indexes() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Relations" RESOURCE "relation" ;
聽 聽 聽 ACTION ( cAlias )->( Relations() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Top" RESOURCE "top" ;
聽 聽 聽 ACTION ( oBrw:GoTop(), oBrw:SetFocus() ) GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Bottom" RESOURCE "bottom" ;
聽 聽 聽 ACTION ( oBrw:GoBottom(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Struct" RESOURCE "struct" ;
聽 聽 聽 ACTION ( oBrw:cAlias )->( Struct() ) GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report()

聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd LINES ;
聽 聽 聽 ON CHANGE ( oMsgBar:cMsgDef := "Alias: " + Alias() + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽" RecNo: " + AllTrim( Str( RecNo() ) ) + "/" + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽AllTrim( Str( RecCount() ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgBar:Refresh(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgTagName:SetText( "Ordered by: " + If( ! Empty( OrdName() ), OrdName(), "Natural order" ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgDeleted:SetText( If( ( oBrw:cAlias )->( Deleted() ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"DELETED", "NON DELETED" ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgDeleted:SetBitmap( If( ( oBrw:cAlias )->( Deleted() ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"deleted", "nondeleted" ) ) )

聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_BLACK ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_BLACK ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_WHITE ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 0x33, 0x66, 0xCC ) } }
聽 聽cClrBack = Eval( oBrw:bClrSelFocus )[ 2 ] 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:bClrSelFocus = { || { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_WHITE ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 cClrBack } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽oBrw:bLDblClick = { || ( oBrw:cAlias )->( Edit() ) } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽
聽 聽oWnd:oClient = oBrw
聽 聽oWnd:oControl = oBrw

聽 聽DEFINE MSGBAR oMsgBar PROMPT "Alias: " + Alias() + " | RecNo: " + ;
聽 聽 聽 AllTrim( Str( RecNo() ) ) + "/" + ;
聽 聽 聽 AllTrim( Str( RecCount() ) ) ;
聽 聽 聽 OF oWnd 2010 

聽 聽DEFINE MSGITEM oMsgTagName OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT "Ordered by: " + ;
聽 聽 聽 聽 聽 If( ! Empty( ( oBrw:cAlias )->( OrdName() ) ),;
聽 聽 聽 聽 聽 聽 聽 ( oBrw:cAlias )->( OrdName() ), "Natural order" ) ;
聽 聽 聽 聽 聽 SIZE 150

聽 聽DEFINE MSGITEM oMsgDeleted OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT If( ( oBrw:cAlias )->( Deleted() ), "DELETED", "NON DELETED" ) ;
聽 聽 聽 聽 聽 SIZE 130 ;
聽 聽 聽 聽 聽 BITMAPS "nondeleted" ;
聽 聽 聽 聽 聽 ACTION ( oBrw:cAlias )->( DelRecord( oBrw, oMsgDeleted ) ) 聽 
聽 聽 聽 聽 聽 
聽 聽ACTIVATE WINDOW oWnd ;
聽 聽 聽 VALID ( ( cAlias )->( DbCloseArea() ), oBrw:cAlias := "", .T. )
聽 聽
return nil 聽 

//----------------------------------------------------------------------------//

function Copy()

聽 聽if oWndMain:oWndActive != nil
聽 聽 聽 oWndMain:oWndActive:Copy()
聽 聽endif 聽 

return nil

//----------------------------------------------------------------------------//
聽 
function DelField( aFields, cFieldName, oGet, oBrw )

聽 聽if Len( aFields ) >= 1
聽 聽 聽 ADel( aFields, oBrw:nArrayAt, .T. )
聽 聽 聽 oBrw:SetArray( aFields )
聽 聽endif

聽 聽oGet:VarPut( cFieldName := Space( 10 ) )
聽 聽oGet:SetPos( 0 )
聽 聽oGet:SetFocus()
聽 聽oBrw:GoBottom()
聽 聽 聽 聽 聽 聽 聽 聽
return nil

//----------------------------------------------------------------------------//
聽 聽 聽 聽
function DelRecord( oBrw, oMsgDeleted )

聽 聽if ! Deleted() 
聽 聽 聽 if ! MsgYesNo( "Want to delete this record ?" )
聽 聽 聽 聽 聽return nil
聽 聽 聽 endif 聽 
聽 聽 聽 DbRLock() 聽 
聽 聽 聽 DbDelete() 聽 
聽 聽 聽 DbUnlock() 聽 
聽 聽 聽 oMsgDeleted:SetText( "DELETED" )
聽 聽 聽 oMsgDeleted:SetBitmap( "deleted" )
聽 聽else
聽 聽 聽 DbRLock() 聽 
聽 聽 聽 DbRecall() 聽 
聽 聽 聽 DbUnlock() 聽 聽 聽 聽 
聽 聽 聽 oMsgDeleted:SetText( "NON DELETED" )
聽 聽 聽 oMsgDeleted:SetBitmap( "nondeleted" )
聽 聽 聽 MsgInfo( "UnDeleted record" )
聽 聽endif
聽 聽
聽 聽Eval( oBrw:bChange )
聽 聽oBrw:Refresh()

return nil 聽 

//----------------------------------------------------------------------------//
聽 聽
function Edit()

聽 聽local oWnd, aRecord := ( Alias() )->( LoadRecord() ), oBar, oBrw, oMsgBar
聽 聽local cAlias := Alias(), oBtnSave, nRecNo := ( Alias() )->( RecNo() )
聽 聽local oMsgDeleted
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Edit " + Alias() MDICHILD

聽 聽oWndMain:oBar:AEvalWhen()

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON oBtnSave OF oBar PROMPT "Save" RESOURCE "save" ;
聽 聽 聽 ACTION ( ( cAlias )->( SaveRecord( aRecord, nRecNo ) ), oBtnSave:Disable() )

聽 聽oBtnSave:Disable()

聽 聽DEFINE BUTTON OF oBar PROMPT "Prev" RESOURCE "prev" ;
聽 聽 聽 ACTION GoPrevRecord( oBrw, aRecord, oMsgDeleted ) GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Next" RESOURCE "next" ;
聽 聽 聽 ACTION GoNextRecord( oBrw, aRecord, oMsgDeleted ) 

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report() GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "View" RESOURCE "view" ;
聽 聽 聽 ACTION View( oBrw:aRow[ 2 ], oWnd )
聽 聽 聽 
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd ARRAY aRecord AUTOCOLS LINES ;
聽 聽 聽 HEADERS "FieldName", "Value" COLSIZES 150, 400 FASTEDIT ;
聽 聽 聽 ON CHANGE ( ( cAlias )->( SetEditType( oBrw, oBtnSave ) ), oBrw:DrawLine( .T. ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 oMsgBar:cMsgDef := " RecNo: " + AllTrim( Str( ( cAlias )->( RecNo() ) ) ) + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"/" + AllTrim( Str( ( cAlias )->( RecCount() ) ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 oMsgBar:Refresh() ) 聽 聽 聽 聽 聽 聽 聽 聽 

聽 聽oBrw:nEditTypes = EDIT_GET
聽 聽oBrw:aCols[ 1 ]:nEditType = 0 // Don't allow to edit first column
聽 聽oBrw:aCols[ 2 ]:bOnChange = { || oBtnSave:Enable() }
聽 聽oBrw:aCols[ 2 ]:lWillShowABtn = .T.
聽 聽oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽
聽 聽oWnd:oClient = oBrw

聽 聽DEFINE MSGBAR oMsgBar ;
聽 聽 聽 PROMPT " RecNo: " + AllTrim( Str( ( cAlias )->( RecNo() ) ) ) + "/" + ;
聽 聽 聽 AllTrim( Str( ( cAlias )->( RecCount() ) ) ) OF oWnd 2010

聽 聽DEFINE MSGITEM oMsgDeleted OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT If( ( cAlias )->( Deleted() ), "DELETED", "NON DELETED" ) ;
聽 聽 聽 聽 聽 SIZE 130 ;
聽 聽 聽 聽 聽 BITMAPS If( ( cAlias )->( Deleted() ), "deleted", "nondeleted" ) ;
聽 聽 聽 聽 聽 ACTION ( cAlias )->( DelRecord( oBrw, oMsgDeleted ) ) 聽 
聽 聽
聽 聽ACTIVATE WINDOW oWnd
聽 聽
return nil 聽 聽 聽

//----------------------------------------------------------------------------//

function GoPrevRecord( oBrw, aRecord, oMsgDeleted )

聽 聽DbSkip( -1 )
聽 聽
聽 聽oBrw:SetArray( aRecord := LoadRecord() )
聽 聽oBrw:SetFocus()
聽 聽Eval( oBrw:bChange )

聽 聽oMsgDeleted:SetText( If( Deleted(), "DELETED", "NON DELETED" ) )
聽 聽oMsgDeleted:SetBitmap( If( Deleted(), "deleted", "nondeleted" ) )
聽 聽
return nil

//----------------------------------------------------------------------------//

function GoNextRecord( oBrw, aRecord, oMsgDeleted )

聽 聽DbSkip( 1 )
聽 聽
聽 聽If Eof()
聽 聽 聽 DbSkip( -1 )
聽 聽else
聽 聽 聽 oBrw:SetArray( aRecord := LoadRecord() )
聽 聽 聽 oBrw:SetFocus()
聽 聽 聽 Eval( oBrw:bChange )
聽 聽endif 聽 

聽 聽oMsgDeleted:SetText( If( Deleted(), "DELETED", "NON DELETED" ) )
聽 聽oMsgDeleted:SetBitmap( If( Deleted(), "deleted", "nondeleted" ) )
聽 聽
return nil

//----------------------------------------------------------------------------//

function SetEditType( oBrw, oBtnSave )

聽 聽local cType := FieldType( oBrw:nArrayAt )
聽 聽
聽 聽do case
聽 聽 聽 case cType == "M"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_BUTTON
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:bEditBlock = { | c | c := oBrw:aRow[ 2 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽MemoEdit( @oBrw:aRow[ 2 ], FieldName( oBrw:nArrayAt ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( ! c == oBrw:aRow[ 2 ], oBtnSave:Enable(),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:aRow[ 2 ] }
聽 聽
聽 聽 聽 case cType == "D"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_BUTTON
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:bEditBlock = { || If( ! Empty( oBrw:aRow[ 2 ] ) .and. ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽! AllTrim( oBrw:aRow[ 2 ] ) == "/ 聽/",;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽DToC( MsgDate( CtoD( oBrw:aRow[ 2 ] ) ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽DToC( MsgDate( Date() ) ) ) }
聽 聽
聽 聽 聽 case cType == "L"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_LISTBOX
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:aEditListTxt 聽 = { ".T.", ".F." }
聽 聽 聽 聽 聽 聽
聽 聽 聽 otherwise
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_GET
聽 聽endcase
聽 聽
return nil 聽 聽 聽 聽 聽 聽 聽

//----------------------------------------------------------------------------//

function IndexBuilder()

聽 聽local oDlg, cExp := Space( 80 ), cTo := Space( 80 ), cTag := Space( 20 )
聽 聽local cFor := Space( 80 ), cWhile := Space( 80 ), lUnique := .F.
聽 聽local lDescend := .F., lMemory := .F., cScope := "All", nRecNo
聽 聽local oPgr, nMeter := 0, nStep := 10, lTag := .T. 
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Index builder" SIZE 530, 380 

聽 聽@ 0.4, 3 SAY "Expression:" OF oDlg SIZE 40, 8

聽 聽@ 0.5, 6 GET cExp OF oDlg SIZE 200, 11 ACTION ExpBuilder( @cExp ) ;
聽 聽 聽 VALID ! Empty( cExp )
聽 聽
聽 聽@ 1.5, 6 SAY "To:" OF oDlg SIZE 40, 8

聽 聽@ 1.7, 6 GET cTo OF oDlg SIZE 200, 11

聽 聽@ 2.6, 5.5 SAY "Tag:" OF oDlg SIZE 40, 8

聽 聽@ 聽 3, 6 GET cTag OF oDlg SIZE 100, 11
聽 聽
聽 聽@ 3.7, 5.9 SAY "For:" OF oDlg SIZE 40, 8

聽 聽@ 4.3, 6 GET cFor OF oDlg SIZE 200, 11 ACTION ExpBuilder()

聽 聽@ 4.8, 5 SAY "While:" OF oDlg SIZE 40, 8

聽 聽@ 5.6, 6 GET cWhile OF oDlg SIZE 200, 11 ACTION ExpBuilder()
聽 聽
聽 聽@ 6.8, 6.9 CHECKBOX lUnique PROMPT "&Unique" OF oDlg SIZE 50, 8

聽 聽@ 6.8, 13.9 CHECKBOX lDescend PROMPT "&Descending" OF oDlg SIZE 80, 8

聽 聽@ 6.8, 23 CHECKBOX lMemory PROMPT "&Memory" OF oDlg SIZE 80, 8

聽 聽@ 6.8, 8 SAY "Scope:" OF oDlg SIZE 40, 8
聽 聽
聽 聽@ 8.2, 6 COMBOBOX cScope ITEMS { "All", "Next", "Record", "Rest" } OF oDlg

聽 聽@ 6.8, 16.1 SAY "Record:" OF oDlg SIZE 40, 8

聽 聽@ 8.8, 12.1 GET nRecNo OF oDlg SIZE 30, 11

聽 聽@ 8.5, 8 SAY "Progress:" OF oDlg SIZE 40, 8
聽 聽
聽 聽@ 9.2, 8 PROGRESS oPgr OF oDlg SIZE 200, 10
聽 聽
聽 聽@ 9.2, 13 BUTTON "C&reate" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( OrdCondSet( If( ! Empty( cFor ), cFor,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( ! Empty( cFor ), GENBLOCK( cFor ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "All", .T.,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( ! Empty( cWhile ), GENBLOCK( cWhile ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ || nMeter += nStep, oPgr:SetPos( nMeter ), SysRefresh() },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nStep, Recno(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "Next", nRecNo,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "Record", nRecNo,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "Rest", .T.,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( lDescend, .T.,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽lTag,, .F., .F., .F., .T., .F., .F. ),;
聽 聽 聽 聽 聽 聽 聽 聽OrdCreate( OrdBagName(), If( lTag, cTag,), cExp, GENBLOCK( cExp ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( lUnique, .T.,) ), oDlg:End() ) 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽

聽 聽@ 9.2, 24 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End() CANCEL
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED

return nil

//----------------------------------------------------------------------------//

function Indexes()

聽 聽local oWnd, oBar, oBrw, oMsgBar
聽 聽local cAlias := Alias(), aIndexes := { Array( 6 ) } 
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Indexes of " + Alias() MDICHILD

聽 聽oWndMain:oBar:AEvalWhen()

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70

聽 聽DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
聽 聽 聽 ACTION ( IndexBuilder(), oBrw:Refresh(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
聽 聽 聽 ACTION ( MsgInfo( "Edit" ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
聽 聽 聽 ACTION If( MsgYesNo( "Want to delete this tag ?" ),;
聽 聽 聽 聽 聽 聽 聽 聽 ( ( cAlias )->( OrdDestroy( oBrw:nArrayAt ) ), oBrw:Refresh() ),)

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report() GROUP
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd ARRAY aIndexes AUTOCOLS LINES ;
聽 聽 聽 HEADERS "Order", "TagName", "Expression", "For", "BagName", "BagExt" ;
聽 聽 聽 COLSIZES 50, 100, 400, 240, 100, 100

聽 聽oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()

聽 聽oBrw:bKeyCount = { || ( cAlias )->( OrdTagsCount() ) }
聽 聽oBrw:aCols[ 1 ]:bStrData = { || oBrw:nArrayAt }
聽 聽oBrw:aCols[ 2 ]:bStrData = { || OrdName( oBrw:nArrayAt ) }
聽 聽oBrw:aCols[ 3 ]:bStrData = { || OrdKey( oBrw:nArrayAt ) }
聽 聽oBrw:aCols[ 4 ]:bStrData = { || OrdFor( oBrw:nArrayAt ) }
聽 聽oBrw:aCols[ 5 ]:bStrData = { || OrdBagName( oBrw:nArrayAt ) }
聽 聽oBrw:aCols[ 6 ]:bStrData = { || OrdBagExt( oBrw:nArrayAt ) }

聽 聽oBrw:SetFocus()
聽 聽
聽 聽oWnd:oClient = oBrw

聽 聽DEFINE MSGBAR oMsgBar 2010
聽 聽
聽 聽ACTIVATE WINDOW oWnd 

return nil

//----------------------------------------------------------------------------//

function ExpBuilder( cExp )

聽 聽local oDlg, oBrw, aFields := DBStruct()
聽 聽local oExp, cFunction
聽 聽
聽 聽cExp = RTrim( cExp )
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Expression builder" SIZE 480, 450
聽 聽
聽 聽@ 0.2, 1.5 SAY "Expression:" SIZE 80, 11 OF oDlg
聽 聽
聽 聽@ 1.1, 1 GET oExp VAR cExp MEMO SIZE 221, 27
聽 聽
聽 聽@ 3, 1.5 SAY "Fields" OF oDlg SIZE 40, 10
聽 聽
聽 聽@ 4, 1 XBROWSE oBrw ARRAY aFields AUTOCOLS LINES SIZE 120, 120 ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 95, 30, 30, 30 
聽 聽 聽 
聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:bLDblClick = { || cExp += oBrw:aRow[ 1 ], oExp:Refresh() } 

聽 聽@ 3, 23.1 SAY "Operators" OF oDlg SIZE 40, 10

聽 聽@ 3.1, 23 BUTTON "=" OF oDlg SIZE 15, 15 ACTION ( cExp += " = ", oExp:Refresh() )

聽 聽@ 3.1, 26.2 BUTTON "<>" OF oDlg SIZE 15, 15 ACTION ( cExp += " <> ", oExp:Refresh() )

聽 聽@ 3.1, 29.4 BUTTON "+" OF oDlg SIZE 15, 15 ACTION ( cExp += " + ", oExp:Refresh() )

聽 聽@ 3.1, 32.6 BUTTON "(" OF oDlg SIZE 15, 15 ACTION ( cExp += " ( ", oExp:Refresh() )

聽 聽@ 3.1, 35.8 BUTTON ".T." OF oDlg SIZE 15, 15 ACTION ( cExp += " .T. ", oExp:Refresh() )

聽 聽@ 4.1, 23 BUTTON "<" OF oDlg SIZE 15, 15 ACTION ( cExp += " < ", oExp:Refresh() )

聽 聽@ 4.1, 26.2 BUTTON ">" OF oDlg SIZE 15, 15 ACTION ( cExp += " > ", oExp:Refresh() )

聽 聽@ 4.1, 29.4 BUTTON "-" OF oDlg SIZE 15, 15 ACTION ( cExp += " - ", oExp:Refresh() )

聽 聽@ 4.1, 32.6 BUTTON ")" OF oDlg SIZE 15, 15 ACTION ( cExp += " )", oExp:Refresh() )

聽 聽@ 4.1, 35.8 BUTTON ".F." OF oDlg SIZE 15, 15 ACTION ( cExp += " .F. ", oExp:Refresh() )

聽 聽@ 5.1, 23 BUTTON "<=" OF oDlg SIZE 15, 15 ACTION ( cExp += " <= ", oExp:Refresh() )

聽 聽@ 5.1, 26.2 BUTTON ">=" OF oDlg SIZE 15, 15 ACTION ( cExp += " >= ", oExp:Refresh() )

聽 聽@ 5.1, 29.4 BUTTON "*" OF oDlg SIZE 15, 15 ACTION ( cExp += " * ", oExp:Refresh() )

聽 聽@ 5.1, 32.6 BUTTON "/" OF oDlg SIZE 15, 15 ACTION ( cExp += " / ", oExp:Refresh() )

聽 聽@ 5.1, 35.8 BUTTON "$" OF oDlg SIZE 15, 15 ACTION ( cExp += " $ ", oExp:Refresh() )

聽 聽@ 6.1, 23 BUTTON '"' OF oDlg SIZE 15, 15 ACTION ( cExp += '"', oExp:Refresh() )

聽 聽@ 6.1, 26.2 BUTTON "!" OF oDlg SIZE 15, 15 ACTION ( cExp += " ! ", oExp:Refresh() )

聽 聽@ 6.1, 29.4 BUTTON "SP" OF oDlg SIZE 15, 15 ACTION ( cExp += " ", oExp:Refresh() )

聽 聽@ 6.1, 32.6 BUTTON "," OF oDlg SIZE 15, 15 ACTION ( cExp += ", ", oExp:Refresh() )

聽 聽@ 6.1, 35.8 BUTTON ":" OF oDlg SIZE 15, 15 ACTION ( cExp += " : ", oExp:Refresh() )

聽 聽@ 7.1, 23 BUTTON "AND" OF oDlg SIZE 27, 15 ACTION ( cExp += " .and. ", oExp:Refresh() )

聽 聽@ 7.1, 28.4 BUTTON "OR" OF oDlg SIZE 27, 15 ACTION ( cExp += " .or. ", oExp:Refresh() )

聽 聽@ 7.1, 33.7 BUTTON "NOT" OF oDlg SIZE 27, 15 ACTION ( cExp += " ! ", oExp:Refresh() )

聽 聽@ 10.3, 23.2 SAY "Functions" OF oDlg SIZE 84, 11

聽 聽@ 11.9, 17.3 COMBOBOX cFunction ITEMS { "AllTrim()", "Left()", "Right()", "SubStr()" } ;
聽 聽 聽 OF oDlg SIZE 92, 80 ON CHANGE ( cExp += Left( cFunction, Len( cFunction ) - 1 ) + " ",;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oExp:Refresh() )

聽 聽@ 11, 13 BUTTON "&Ok" OF oDlg SIZE 45, 13 ACTION oDlg:End()

聽 聽@ 11, 24 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End() CANCEL
聽 聽 聽 聽 聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED

return cExp

//----------------------------------------------------------------------------//

function LoadRecord()

聽 聽local aRecord := {}, n
聽 聽
聽 聽for n = 1 to FCount()
聽 聽 聽 AAdd( aRecord, { FieldName( n ), FieldGet( n ) } )
聽 聽next
聽 聽
return aRecord 聽 聽 聽
聽 聽
//----------------------------------------------------------------------------// 

function Search( oBrw )

聽 聽local oDlg, oCbx, cSearch := Space( 50 )
聽 聽local nRecNo := RecNo(), lInc := .T.
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Search: " + Alias() SIZE 400, 200
聽 聽
聽 聽@ 0.5, 1.5 SAY "Ordered by: " + OrdName() OF oDlg
聽 聽
聽 聽@ 1.2, 1.5 SAY "Key: " + OrdKey() OF oDlg
聽 聽
聽 聽@ 2.4, 1.2 COMBOBOX oCbx VAR cSearch ITEMS aSearches OF oDlg SIZE 180, 150 ;
聽 聽 聽STYLE CBS_DROPDOWN
聽 聽
聽 聽oCbx:oGet:bChange = { || DbSeek( AllTrim( oCbx:GetText() ), lInc ), oBrw:Refresh() } 
聽 聽
聽 聽@ 3.7, 1.5 CHECKBOX lInc PROMPT "&Incremental" OF oDlg SIZE 80, 10
聽 聽
聽 聽@ 4, 7 BUTTON "&Ok" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( If( ! DbSeek( AllTrim( cSearch ), lInc ), DbGoTo( nRecNo ),),;
聽 聽 聽 聽 聽 聽 聽 聽AAdd( aSearches, AllTrim( cSearch ) ), oDlg:End() )

聽 聽@ 4, 18 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End()
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED
聽 聽
return nil 聽 

//----------------------------------------------------------------------------// 

function Relations()

聽 聽local oWnd, oBar, oBrw, aRelations := { Array( 5 ) }, n
聽 聽local nTarget
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Relations of " + Alias() MDICHILD

聽 聽oWndMain:oBar:AEvalWhen()

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70

聽 聽DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
聽 聽 聽 ACTION MsgInfo( "Add" )

聽 聽DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
聽 聽 聽 ACTION ( MsgInfo( "Edit" ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
聽 聽 聽 ACTION MsgInfo( "del" )

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report() GROUP
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd ARRAY aRelations AUTOCOLS LINES ;
聽 聽 聽 HEADERS "Rel.", "Expression", "Child Alias", "Additive", "Scoped" ;
聽 聽 聽 COLSIZES 40, 150, 400, 100, 100

聽 聽oBrw:bKeyCount = { || 8 }
聽 聽oBrw:aCols[ 1 ]:bStrData = { || oBrw:nArrayAt }
聽 聽oBrw:aCols[ 2 ]:bStrData = { || DbRelation( oBrw:nArrayAt ) }
聽 聽oBrw:aCols[ 3 ]:bStrData = { || If( DbRSelect( oBrw:nArrayAt ) != 0,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽Alias( DbRSelect( oBrw:nArrayAt ) ), "" ) }
聽 聽oBrw:aCols[ 4 ]:bStrData = { || ".F." }
聽 聽oBrw:aCols[ 5 ]:bStrData = { || ".F." }

聽 聽oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽
聽 聽oWnd:oClient = oBrw

聽 聽DEFINE MSGBAR oMsgBar 2010

聽 聽ACTIVATE WINDOW oWnd

return nil

//----------------------------------------------------------------------------// 

function SaveRecord( aRecord, nRecNo )

聽 聽local n

聽 聽( Alias() )->( DbGoTo( nRecNo ) )
聽 聽
聽 聽if ( Alias() )->( DbRLock( nRecNo ) )
聽 聽 聽 for n = 1 to Len( aRecord )
聽 聽 聽 聽 聽( Alias() )->( FieldPut( n, aRecord[ n ][ 2 ] ) )
聽 聽 聽 next
聽 聽 聽 ( Alias() )->( DbUnLock() )
聽 聽 聽 MsgInfo( "Record updated" )
聽 聽else
聽 聽 聽 MsgAlert( "Record in use, please try it again" )
聽 聽endif 聽 聽 聽 聽 

return nil 聽 聽 聽

//----------------------------------------------------------------------------// 

function Struct()

聽 聽local oDlg, oBrw, aFields := DbStruct()
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE Alias() + " fields" SIZE 400, 400

聽 聽@ 0, 0 XBROWSE oBrw ARRAY aFields AUTOCOLS LINES ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 150, 50, 80, 80

聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽
聽 聽oBrw:CreateFromCode()
聽 聽 聽 
聽 聽oDlg:oClient = oBrw
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED ;
聽 聽 聽 ON INIT ( BuildStructBar( oDlg, oBrw ), oDlg:Resize(), oBrw:SetFocus() )
聽 聽
return nil 聽 

//----------------------------------------------------------------------------// 

function BuildStructBar( oDlg, oBrw )

聽 聽local oBar

聽 聽DEFINE BUTTONBAR oBar OF oDlg 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Code" RESOURCE "code" ;
聽 聽 聽 ACTION ( TxtStruct(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oDlg:End() GROUP

return nil

//----------------------------------------------------------------------------// 

function TxtStruct()

聽 聽local cCode := "local aFields := { ", n
聽 聽
聽 聽for n = 1 to FCount()
聽 聽 聽 if n > 1
聽 聽 聽 聽 聽cCode += Space( 27 )
聽 聽 聽 endif 聽 
聽 聽 聽 cCode += '{ "' + FieldName( n ) + '", "' + ;
聽 聽 聽 聽 聽 聽 聽 聽FieldType( n ) + '", ' + ;
聽 聽 聽 聽 聽 聽 聽 聽AllTrim( Str( FieldLen( n ) ) ) + ", " + ;
聽 聽 聽 聽 聽 聽 聽 聽AllTrim( Str( FieldDec( n ) ) ) + " },;" + CRLF
聽 聽next
聽 聽
聽 聽cCode = SubStr( cCode, 1, Len( cCode ) - 4 ) + " }"
聽 聽
聽 聽MemoEdit( cCode, "Code" )

return nil

//----------------------------------------------------------------------------// 聽 

function View( cFileName, oWnd )

聽 聽local cExt := Lower( cFileExt( cFileName ) )
聽 聽
聽 聽do case
聽 聽 聽 case cExt == "bmp"
聽 聽 聽 聽 聽 聽WinExec( "mspaint" + " " + cFileName )
聽 聽 聽 聽 聽 聽
聽 聽 聽 case cExt == "txt"
聽 聽 聽 聽 聽 聽WinExec( "notepad" + " " + cFileName ) 聽 聽 
聽 聽 聽 聽 聽 聽
聽 聽 聽 otherwise
聽 聽 聽 聽 聽 聽ShellExecute( oWnd:hWnd, "Open", cFileName )
聽 聽endcase
聽 聽
return nil 聽 聽 聽 聽 聽 聽 聽 聽

//----------------------------------------------------------------------------// 聽 

function New()

聽 聽local oDlg, oGet, oBrw, oBtn
聽 聽local cFieldName := Space( 10 ), cType := "Character", nLen := 10, nDec := 0
聽 聽local aFields := { Array( 4 ) }, cDbfName := Space( 8 ), aTemp
聽 聽local oLen, oDec, aType := { "Character", "Number", "Date", "Logical", "Memo" }
聽 聽local bChange := {|| If( cType == "Character", (nLen := 10, nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Number", 聽 聽(nLen := 10, nDec := 0, oDec:Enable() 聽),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Date", 聽 聽 聽(nLen := 8, 聽nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Logical", 聽 (nLen := 1, 聽nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Memo", 聽 聽 聽(nLen := 10, nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oDlg:Update() }
聽 聽local bEdit := {|| IF ( !Empty (aFields[1,1]) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 (oBtn:Enable (),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽cFieldName := aFields[oBrw:nArrayAt,1] ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽cType := aFields[oBrw:nArrayAt,2] ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽cType := aType[ aScan(aType, {|x| Left(x,1) = cType} )],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽Eval (bChange) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nLen := aFields[oBrw:nArrayAt,3] ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nDec := aFields[oBrw:nArrayAt,4] ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oGet:SetPos( 0 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oGet:SetFocus(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oDlg:Update() ) ,) ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽}
聽 聽local bSave := {|| oBtn:Disable (),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aFields[oBrw:nArrayAt,1] := cFieldname,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aFields[oBrw:nArrayAt,2] := Left (cType,1),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aFields[oBrw:nArrayAt,3] := nLen,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aFields[oBrw:nArrayAt,4] := nDec,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oBrw:SetArray (aFields),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 cFieldName := Space( 10 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Eval (bChange) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oDlg:Update() ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oGet:SetPos( 0 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oGet:SetFocus(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oBrw:GoBottom();
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 }

聽 聽DEFINE DIALOG oDlg TITLE "DBF builder" SIZE 415, 400

聽 聽@ 0.5, 聽2 SAY "Field Name" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 10 SAY "Type" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 17 SAY "Len" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 22 SAY "Dec" OF oDlg SIZE 20, 8

聽 聽@ 1.4, 1 GET oGet VAR cFieldName PICTURE "!!!!!!!!!!" OF oDlg SIZE 41, 11 UPDATE

聽 聽@ 1.3, 6.5 COMBOBOX cType ITEMS aType ;
聽 聽 聽 OF oDlg ON CHANGE Eval (bChange) UPDATE

聽 聽@ 1.4, 11.9 GET oLen VAR nLen PICTURE "999" OF oDlg SIZE 25, 11 UPDATE

聽 聽@ 1.4, 15.4 GET oDec VAR nDec PICTURE "999" OF oDlg SIZE 25, 11 UPDATE

聽 聽@ 0.9, 26 BUTTON "&Add" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION AddField( @aFields, @cFieldName, @cType, @nLen, @nDec, oGet, oBrw )

聽 聽@ 2.4, 26 BUTTON oBtn PROMPT "&Edit" OF oDlg SIZE 45, 13 ;
聽 聽 聽ACTION Eval (bSave)

聽 聽@ 3.4, 26 BUTTON "&Delete" OF oDlg SIZE 45, 13 ;
聽 聽 聽ACTION DelField (@aFields, @cFieldName, oGet, oBrw)

聽 聽@ 4.4, 26 BUTTON "Move &Up" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION If( oBrw:nArrayAt > 1,;
聽 聽 聽 聽 聽 聽 聽 聽 聽( aTemp := aFields[ oBrw:nArrayAt ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt ] := aFields[ oBrw:nArrayAt - 1 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt - 1 ] := aTemp,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:GoUp() ),)

聽 聽@ 5.4, 26 BUTTON "Move D&own" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION If( oBrw:nArrayAt < Len( aFields ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽( aTemp := aFields[ oBrw:nArrayAt ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt ] := aFields[ oBrw:nArrayAt + 1 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt + 1 ] := aTemp,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:GoDown() ),)

聽 聽@ 6.4, 26 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End()

聽 聽@ 2.2, 2 SAY "Fields" OF oDlg SIZE 40, 8

聽 聽@ 3.2, 1 XBROWSE oBrw ARRAY aFields AUTOCOLS ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 90, 55, 40, 40 ;
聽 聽 聽 SIZE 140, 130 OF oDlg ;
聽 聽 聽 ON DBLCLICK Eval (bEdit)

聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } }
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()

聽 聽@ 12.1, 2 SAY "DBF Name:" OF oDlg SIZE 30, 8

聽 聽@ 14, 6 GET cDbfName PICTURE "!!!!!!!!!!!!" OF oDlg SIZE 100, 11

聽 聽@ 10, 26 BUTTON "&Create" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( If( ! Empty( cDbfName ) .and. Len( aFields ) > 0,;
聽 聽 聽 聽 聽 DbCreate( AllTrim( cDbfName ), aFields ),), oDlg:End(),;
聽 聽 聽 聽 聽 Open( hb_CurDrive() + ":\" + CurDir() + "\" + AllTrim( cDbfName ) ) )

聽 聽ACTIVATE DIALOG oDlg CENTERED ON INIT (Eval (bChange), oBtn:Disable() ) ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽VALID !GETKEYSTATE( VK_ESCAPE )

return nil

//----------------------------------------------------------------------------//

function AddField( aFields, cFieldName, cType, nLen, nDec, oGet, oBrw )

聽 聽if Empty( cFieldName )
聽 聽 聽 oGet:SetPos( 0 )
聽 聽 聽 return nil
聽 聽endif

聽 聽if Len( aFields ) == 1 .and. Empty( aFields[ 1 ][ 1 ] )
聽 聽 聽 aFields = { { cFieldName, Upper( Left( cType, 1 ) ), nLen, nDec } }
聽 聽else
聽 聽 聽 AAdd( aFields, { cFieldName, Upper( Left( cType, 1 ) ), nLen, nDec } )
聽 聽endif

聽 聽oBrw:SetArray( aFields )
聽 聽oGet:VarPut( cFieldName := Space( 10 ) )
聽 聽oGet:SetPos( 0 )
聽 聽oGet:SetFocus()
聽 聽oBrw:GoBottom()

return nil
聽 聽 聽 聽 
//----------------------------------------------------------------------------//

function OrdTagsCount()

聽 聽local n, nCount := 0
聽 聽
聽 聽for n = 1 to 100
聽 聽 聽 if ! Empty( OrdKey( n ) )
聽 聽 聽 聽 聽nCount++
聽 聽 聽 endif 聽 
聽 聽next
聽 聽
return nCount 聽 
聽 聽
//----------------------------------------------------------------------------// 聽

function Paste()

聽 聽if oWndMain:oWndActive != nil
聽 聽 聽 oWndMain:oWndActive:Paste()
聽 聽endif 聽 

return nil

//----------------------------------------------------------------------------// 聽

#pragma BEGINDUMP

#include <hbapi.h>
#include <hbapirdd.h>

HB_FUNC( ORDCONDGET )
{
聽 聽AREAP pArea = ( AREAP ) hb_rddGetCurrentWorkAreaPointer();
聽 聽
聽 聽if( pArea )
聽 聽{
聽 聽 聽 LPDBORDERCONDINFO lpdbOrdCondInfo = pArea->lpdbOrdCondInfo;
聽 聽 聽 
聽 聽 聽 if( lpdbOrdCondInfo && lpdbOrdCondInfo->abWhile )
聽 聽 聽 聽 聽hb_retc( lpdbOrdCondInfo->abWhile );
聽 聽 聽 else
聽 聽 聽 聽 聽hb_retc( "" ); 聽 
聽 聽}
聽 聽else
聽 聽 聽 hb_retc( "" ); 聽 聽 
}

#pragma ENDDUMP

//----------------------------------------------------------------------------//
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: FiveDBU para 32/64 bits
Posted: Tue Jun 05, 2012 04:34 PM


Code (fw): Select all Collapse
#include "FiveWin.ch"
#include "xbrowse.ch"
#include "dbinfo.ch"

#ifdef __XHARBOUR__
聽 聽#define hb_CurDrive() CurDrive()
#endif 聽 

#define GENBLOCK(x) 聽&( "{ || " + x + " }" )

REQUEST DBFCDX

static oWndMain, oMruDBFs, aSearches := {}

//----------------------------------------------------------------------------//

function Main( cDbfName )

聽 聽local oBar, oBmpTiled
聽 聽
聽 聽SET DATE FORMAT TO "DD/MM/YYYY"

聽 聽SetDlgGradient( { { 1, RGB( 199, 216, 237 ), RGB( 237, 242, 248 ) } } )

聽 聽DEFINE BITMAP oBmpTiled RESOURCE "background"

聽 聽DEFINE WINDOW oWndMain TITLE "FiveDBU" MDI MENU BuildMenu()

聽 聽DEFINE BUTTONBAR oBar OF oWndMain 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "New" RESOURCE "new" ACTION New()

聽 聽DEFINE BUTTON OF oBar PROMPT "Open" RESOURCE "open" ACTION Open()

聽 聽DEFINE BUTTON OF oBar PROMPT "Copy" RESOURCE "copy" ACTION Copy() GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Paste" RESOURCE "paste" ACTION Paste()

聽 聽DEFINE BUTTON OF oBar PROMPT "Prev" RESOURCE "prev" ;
聽 聽 聽 ACTION oWndMain:PrevWindow() GROUP WHEN Len( oWndMain:oWndClient:aWnd ) > 1

聽 聽DEFINE BUTTON OF oBar PROMPT "Next" RESOURCE "next" ;
聽 聽 聽 ACTION oWndMain:NextWindow() WHEN Len( oWndMain:oWndClient:aWnd ) > 1

聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWndMain:End() GROUP

聽 聽DEFINE MSGBAR PROMPT "FiveDBU 32/64 bits, (c) FiveTech Software 2012" ;
聽 聽 聽 OF oWndMain 2010 KEYBOARD DATE

聽 聽if ! Empty( cDbfName )
聽 聽 聽 Open( cDbfName )
聽 聽endif 聽 

聽 聽ACTIVATE WINDOW oWndMain MAXIMIZED ;
聽 聽 聽 VALID MsgYesNo( "Want to end ?" ) ;
聽 聽 聽 ON PAINT DrawTiled( hDC, oWndMain, oBmpTiled )
聽 聽
聽 聽oBmpTiled:End() 聽 聽 聽

return nil

//----------------------------------------------------------------------------//

function BuildMenu()

聽 聽local oMenu
聽 聽
聽 聽MENU oMenu
聽 聽 聽 MENUITEM "Files"
聽 聽 聽 MENU
聽 聽 聽 聽 聽MENUITEM "New..."
聽 聽 聽 聽 聽MENUITEM "Open..." ACTION Open()
聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 聽 聽MENUITEM "Recent files"
聽 聽 聽 聽 聽MENU
聽 聽 聽 聽 聽 聽 MRU oMruDBFs ;
聽 聽 聽 聽 聽 聽 聽 聽FILENAME ".\FiveDBU.ini" ; 聽 聽// .INI to manipulate. '\.' for local
聽 聽 聽 聽 聽 聽 聽 聽SECTION 聽"Recent DBF files" ; // The name of the INI section
聽 聽 聽 聽 聽 聽 聽 聽ACTION 聽 Open( cMruItem ) ; 聽 // cMruItem is automatically provided
聽 聽 聽 聽 聽 聽 聽 聽MESSAGE 聽"Open this file" ; 聽 // The message for all of them
聽 聽 聽 聽 聽 聽 聽 聽SIZE 聽 聽 10
聽 聽 聽 聽 聽ENDMENU 聽 聽 聽 

聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 聽 聽MENUITEM "Exit" ACTION oWndMain:End()
聽 聽 聽 ENDMENU
聽 聽 聽 
聽 聽 聽 // oMenu:AddEdit()
聽 聽 聽 oMenu:AddMdi()
聽 聽 聽 oMenu:AddHelp( "FiveDBU", "(c) FiveTech Software 2012" )
聽 聽ENDMENU
聽 聽
return oMenu 聽 聽 聽

//----------------------------------------------------------------------------//

function Open( cFileName )

聽 聽local oWnd, oBar, oBrw, oMsgBar, oMsgRecNo, oMsgDeleted, oMsgTagName
聽 聽local oPopup, cAlias, n, cClrBack, nTags
聽 聽
聽 聽DEFAULT cFileName := cGetFile( "*.dbf", "Please select a DBF" )
聽 聽
聽 聽if Empty( cFileName )
聽 聽 聽 return nil
聽 聽endif 聽 
聽 聽
聽 聽if ! "." $ cFileName
聽 聽 聽 cFileName += ".dbf"
聽 聽endif 聽 
聽 聽
聽 聽if ! File( cFileName )
聽 聽 聽 MsgStop( "File not found: " + cFileName )
聽 聽 聽 return nil
聽 聽endif
聽 聽
聽 聽if File( cFileNoExt( cFileName ) + ".ntx" )
聽 聽 聽 USE ( cFileName ) VIA "DBFNTX" NEW SHARED ;
聽 聽 聽 聽 聽ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )
聽 聽else 聽 
聽 聽 聽 USE ( cFileName ) VIA "DBFCDX" NEW SHARED ;
聽 聽 聽 聽 聽ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )
聽 聽 聽 cAlias = Alias()
聽 聽endif 聽 聽 聽 聽
聽 聽
聽 聽oMruDBFs:Save( cFileName )
聽 聽
聽 聽MENU oPopup POPUP
聽 聽 聽 MENUITEM "Natural order" ;
聽 聽 聽 聽 聽ACTION ( ( cAlias )->( DbSetOrder( 0 ) ), oBrw:Refresh(), oBrw:SetFocus(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 ( cAlias )->( Eval( oBrw:bChange ) ) )
聽 聽 聽 
聽 聽 聽 if ( nTags := ( cAlias )->( OrdTagsCount() ) ) > 0
聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 endif 聽 
聽 聽 聽 
聽 聽 聽 for n = 1 to nTags
聽 聽 聽 聽 聽if ! Empty( OrdName( n ) )
聽 聽 聽 聽 聽 聽 if ! Empty( OrdName( 1 ) )
聽 聽 聽 聽 聽 聽 聽 聽DbSetOrder( OrdName( 1 ) )
聽 聽 聽 聽 聽 聽 聽 聽DbGoTop()
聽 聽 聽 聽 聽 聽 endif 聽 
聽 聽 聽 聽 聽 聽 MENUITEM OrdName( n ) ;
聽 聽 聽 聽 聽 聽 聽 聽ACTION ( ( cAlias )->( DbSetOrder( oMenuItem:cPrompt ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oBrw:Refresh(), ( cAlias )->( Eval( oBrw:bChange ) ), oBrw:SetFocus() )
聽 聽 聽 聽 聽endif
聽 聽 聽 next 聽 聽
聽 聽ENDMENU 聽 
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Browse " + cAlias MDICHILD

聽 聽oWnd:bCopy = { || MsgInfo( "copy" ) }

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
聽 聽 聽 ACTION ( ( oBrw:cAlias )->( DbAppend() ), oBrw:Refresh(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
聽 聽 聽 ACTION ( oBrw:cAlias )->( Edit() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
聽 聽 聽 ACTION ( obrw:cAlias )->( DelRecord( oBrw, oMsgDeleted ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Search" RESOURCE "search" ;
聽 聽 聽 GROUP ACTION ( cAlias )->( Search( oBrw ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Index" RESOURCE "index" ;
聽 聽 聽 MENU oPopup ACTION ( cAlias )->( Indexes() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Relations" RESOURCE "relation" ;
聽 聽 聽 ACTION ( cAlias )->( Relations() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Top" RESOURCE "top" ;
聽 聽 聽 ACTION ( oBrw:GoTop(), oBrw:SetFocus() ) GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Bottom" RESOURCE "bottom" ;
聽 聽 聽 ACTION ( oBrw:GoBottom(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Struct" RESOURCE "struct" ;
聽 聽 聽 ACTION ( oBrw:cAlias )->( Struct() ) GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report()

聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd LINES ;
聽 聽 聽 ON CHANGE ( oMsgBar:cMsgDef := "FileName: " + cFileName,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgBar:Refresh(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgRecNo:SetText( "RecNo: " + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 AllTrim( Str( RecNo() ) ) + " / " + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 AllTrim( Str( RecCount() ) ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgTagName:SetText( "Ordered by: " + If( ! Empty( OrdName() ), OrdName(), "Natural order" ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgDeleted:SetText( If( ( oBrw:cAlias )->( Deleted() ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"DELETED", "NON DELETED" ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgDeleted:SetBitmap( If( ( oBrw:cAlias )->( Deleted() ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"deleted", "nondeleted" ) ) )

聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_BLACK ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_BLACK ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_WHITE ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 0x33, 0x66, 0xCC ) } }
聽 聽cClrBack = Eval( oBrw:bClrSelFocus )[ 2 ] 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:bClrSelFocus = { || { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_WHITE ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 cClrBack } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽oBrw:bLDblClick = { || ( oBrw:cAlias )->( Edit() ) } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽
聽 聽oWnd:oClient = oBrw
聽 聽oWnd:oControl = oBrw

聽 聽DEFINE MSGBAR oMsgBar PROMPT "FileName: " + cFileName OF oWnd 2010 

聽 聽DEFINE MSGITEM oMsgRecNo OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT "RecNo: " + ;
聽 聽 聽 聽 聽 AllTrim( Str( RecNo() ) ) + " / " + ;
聽 聽 聽 聽 聽 AllTrim( Str( RecCount() ) ) ;
聽 聽 聽 聽 聽 SIZE 150

聽 聽DEFINE MSGITEM oMsgTagName OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT "Ordered by: " + ;
聽 聽 聽 聽 聽 If( ! Empty( ( oBrw:cAlias )->( OrdName() ) ),;
聽 聽 聽 聽 聽 聽 聽 ( oBrw:cAlias )->( OrdName() ), "Natural order" ) ;
聽 聽 聽 聽 聽 SIZE 150

聽 聽DEFINE MSGITEM oMsgDeleted OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT If( ( oBrw:cAlias )->( Deleted() ), "DELETED", "NON DELETED" ) ;
聽 聽 聽 聽 聽 SIZE 130 ;
聽 聽 聽 聽 聽 BITMAPS "nondeleted" ;
聽 聽 聽 聽 聽 ACTION ( oBrw:cAlias )->( DelRecord( oBrw, oMsgDeleted ) ) 聽 
聽 聽 聽 聽 聽 
聽 聽ACTIVATE WINDOW oWnd ;
聽 聽 聽 VALID ( ( cAlias )->( DbCloseArea() ), oBrw:cAlias := "", .T. )
聽 聽
return nil 聽 

//----------------------------------------------------------------------------//

function Copy()

聽 聽if oWndMain:oWndActive != nil
聽 聽 聽 oWndMain:oWndActive:Copy()
聽 聽endif 聽 

return nil

//----------------------------------------------------------------------------//
聽 
function DelField( aFields, cFieldName, oGet, oBrw )

聽 聽if Len( aFields ) >= 1
聽 聽 聽 ADel( aFields, oBrw:nArrayAt, .T. )
聽 聽 聽 oBrw:SetArray( aFields )
聽 聽endif

聽 聽oGet:VarPut( cFieldName := Space( 10 ) )
聽 聽oGet:SetPos( 0 )
聽 聽oGet:SetFocus()
聽 聽oBrw:GoBottom()
聽 聽 聽 聽 聽 聽 聽 聽
return nil

//----------------------------------------------------------------------------//
聽 聽 聽 聽
function DelRecord( oBrw, oMsgDeleted )

聽 聽if ! Deleted() 
聽 聽 聽 if ! MsgYesNo( "Want to delete this record ?" )
聽 聽 聽 聽 聽return nil
聽 聽 聽 endif 聽 
聽 聽 聽 DbRLock() 聽 
聽 聽 聽 DbDelete() 聽 
聽 聽 聽 DbUnlock() 聽 
聽 聽 聽 oMsgDeleted:SetText( "DELETED" )
聽 聽 聽 oMsgDeleted:SetBitmap( "deleted" )
聽 聽else
聽 聽 聽 DbRLock() 聽 
聽 聽 聽 DbRecall() 聽 
聽 聽 聽 DbUnlock() 聽 聽 聽 聽 
聽 聽 聽 oMsgDeleted:SetText( "NON DELETED" )
聽 聽 聽 oMsgDeleted:SetBitmap( "nondeleted" )
聽 聽 聽 MsgInfo( "UnDeleted record" )
聽 聽endif
聽 聽
聽 聽Eval( oBrw:bChange )
聽 聽oBrw:Refresh()

return nil 聽 

//----------------------------------------------------------------------------//
聽 聽
function Edit()

聽 聽local oWnd, aRecord := ( Alias() )->( LoadRecord() ), oBar, oBrw, oMsgBar
聽 聽local cAlias := Alias(), oBtnSave, nRecNo := ( Alias() )->( RecNo() )
聽 聽local oMsgDeleted
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Edit " + Alias() MDICHILD

聽 聽oWndMain:oBar:AEvalWhen()

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON oBtnSave OF oBar PROMPT "Save" RESOURCE "save" ;
聽 聽 聽 ACTION ( ( cAlias )->( SaveRecord( aRecord, nRecNo ) ), oBtnSave:Disable() )

聽 聽oBtnSave:Disable()

聽 聽DEFINE BUTTON OF oBar PROMPT "Prev" RESOURCE "prev" ;
聽 聽 聽 ACTION GoPrevRecord( oBrw, aRecord, oMsgDeleted ) GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Next" RESOURCE "next" ;
聽 聽 聽 ACTION GoNextRecord( oBrw, aRecord, oMsgDeleted ) 

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report() GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "View" RESOURCE "view" ;
聽 聽 聽 ACTION View( oBrw:aRow[ 2 ], oWnd )
聽 聽 聽 
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd ARRAY aRecord AUTOCOLS LINES ;
聽 聽 聽 HEADERS "FieldName", "Value" COLSIZES 150, 400 FASTEDIT ;
聽 聽 聽 ON CHANGE ( ( cAlias )->( SetEditType( oBrw, oBtnSave ) ), oBrw:DrawLine( .T. ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 oMsgBar:cMsgDef := " RecNo: " + AllTrim( Str( ( cAlias )->( RecNo() ) ) ) + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"/" + AllTrim( Str( ( cAlias )->( RecCount() ) ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 oMsgBar:Refresh() ) 聽 聽 聽 聽 聽 聽 聽 聽 

聽 聽oBrw:nEditTypes = EDIT_GET
聽 聽oBrw:aCols[ 1 ]:nEditType = 0 // Don't allow to edit first column
聽 聽oBrw:aCols[ 2 ]:bOnChange = { || oBtnSave:Enable() }
聽 聽oBrw:aCols[ 2 ]:lWillShowABtn = .T.
聽 聽oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽
聽 聽oWnd:oClient = oBrw

聽 聽DEFINE MSGBAR oMsgBar ;
聽 聽 聽 PROMPT " RecNo: " + AllTrim( Str( ( cAlias )->( RecNo() ) ) ) + "/" + ;
聽 聽 聽 AllTrim( Str( ( cAlias )->( RecCount() ) ) ) OF oWnd 2010

聽 聽DEFINE MSGITEM oMsgDeleted OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT If( ( cAlias )->( Deleted() ), "DELETED", "NON DELETED" ) ;
聽 聽 聽 聽 聽 SIZE 130 ;
聽 聽 聽 聽 聽 BITMAPS If( ( cAlias )->( Deleted() ), "deleted", "nondeleted" ) ;
聽 聽 聽 聽 聽 ACTION ( cAlias )->( DelRecord( oBrw, oMsgDeleted ) ) 聽 
聽 聽
聽 聽ACTIVATE WINDOW oWnd
聽 聽
return nil 聽 聽 聽

//----------------------------------------------------------------------------//

function GoPrevRecord( oBrw, aRecord, oMsgDeleted )

聽 聽DbSkip( -1 )
聽 聽
聽 聽oBrw:SetArray( aRecord := LoadRecord() )
聽 聽oBrw:SetFocus()
聽 聽Eval( oBrw:bChange )

聽 聽oMsgDeleted:SetText( If( Deleted(), "DELETED", "NON DELETED" ) )
聽 聽oMsgDeleted:SetBitmap( If( Deleted(), "deleted", "nondeleted" ) )
聽 聽
return nil

//----------------------------------------------------------------------------//

function GoNextRecord( oBrw, aRecord, oMsgDeleted )

聽 聽DbSkip( 1 )
聽 聽
聽 聽If Eof()
聽 聽 聽 DbSkip( -1 )
聽 聽else
聽 聽 聽 oBrw:SetArray( aRecord := LoadRecord() )
聽 聽 聽 oBrw:SetFocus()
聽 聽 聽 Eval( oBrw:bChange )
聽 聽endif 聽 

聽 聽oMsgDeleted:SetText( If( Deleted(), "DELETED", "NON DELETED" ) )
聽 聽oMsgDeleted:SetBitmap( If( Deleted(), "deleted", "nondeleted" ) )
聽 聽
return nil

//----------------------------------------------------------------------------//

function SetEditType( oBrw, oBtnSave )

聽 聽local cType := FieldType( oBrw:nArrayAt )
聽 聽
聽 聽do case
聽 聽 聽 case cType == "M"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_BUTTON
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:bEditBlock = { | c | c := oBrw:aRow[ 2 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽MemoEdit( @oBrw:aRow[ 2 ], FieldName( oBrw:nArrayAt ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( ! c == oBrw:aRow[ 2 ], oBtnSave:Enable(),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:aRow[ 2 ] }
聽 聽
聽 聽 聽 case cType == "D"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_BUTTON
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:bEditBlock = { || If( ! Empty( oBrw:aRow[ 2 ] ) .and. ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽! AllTrim( oBrw:aRow[ 2 ] ) == "/ 聽/",;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽DToC( MsgDate( CtoD( oBrw:aRow[ 2 ] ) ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽DToC( MsgDate( Date() ) ) ) }
聽 聽
聽 聽 聽 case cType == "L"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_LISTBOX
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:aEditListTxt 聽 = { ".T.", ".F." }
聽 聽 聽 聽 聽 聽
聽 聽 聽 otherwise
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_GET
聽 聽endcase
聽 聽
return nil 聽 聽 聽 聽 聽 聽 聽

//----------------------------------------------------------------------------//

function IndexBuilder()

聽 聽local oDlg, cExp := Space( 80 ), cTo := Space( 80 ), cTag := Space( 20 )
聽 聽local cFor := Space( 80 ), cWhile := Space( 80 ), lUnique := .F.
聽 聽local lDescend := .F., lMemory := .F., cScope := "All", nRecNo
聽 聽local oPgr, nMeter := 0, nStep := 10, lTag := .T. 
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Index builder" SIZE 530, 380 

聽 聽@ 0.4, 3 SAY "Expression:" OF oDlg SIZE 40, 8

聽 聽@ 0.5, 6 GET cExp OF oDlg SIZE 200, 11 ACTION ExpBuilder( @cExp ) ;
聽 聽 聽 VALID ! Empty( cExp )
聽 聽
聽 聽@ 1.5, 6 SAY "To:" OF oDlg SIZE 40, 8

聽 聽@ 1.7, 6 GET cTo OF oDlg SIZE 200, 11

聽 聽@ 2.6, 5.5 SAY "Tag:" OF oDlg SIZE 40, 8

聽 聽@ 聽 3, 6 GET cTag OF oDlg SIZE 100, 11
聽 聽
聽 聽@ 3.7, 5.9 SAY "For:" OF oDlg SIZE 40, 8

聽 聽@ 4.3, 6 GET cFor OF oDlg SIZE 200, 11 ACTION ExpBuilder()

聽 聽@ 4.8, 5 SAY "While:" OF oDlg SIZE 40, 8

聽 聽@ 5.6, 6 GET cWhile OF oDlg SIZE 200, 11 ACTION ExpBuilder()
聽 聽
聽 聽@ 6.8, 6.9 CHECKBOX lUnique PROMPT "&Unique" OF oDlg SIZE 50, 8

聽 聽@ 6.8, 13.9 CHECKBOX lDescend PROMPT "&Descending" OF oDlg SIZE 80, 8

聽 聽@ 6.8, 23 CHECKBOX lMemory PROMPT "&Memory" OF oDlg SIZE 80, 8

聽 聽@ 6.8, 8 SAY "Scope:" OF oDlg SIZE 40, 8
聽 聽
聽 聽@ 8.2, 6 COMBOBOX cScope ITEMS { "All", "Next", "Record", "Rest" } OF oDlg

聽 聽@ 6.8, 16.1 SAY "Record:" OF oDlg SIZE 40, 8

聽 聽@ 8.8, 12.1 GET nRecNo OF oDlg SIZE 30, 11

聽 聽@ 8.5, 8 SAY "Progress:" OF oDlg SIZE 40, 8
聽 聽
聽 聽@ 9.2, 8 PROGRESS oPgr OF oDlg SIZE 200, 10
聽 聽
聽 聽@ 9.2, 13 BUTTON "C&reate" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( OrdCondSet( If( ! Empty( cFor ), cFor,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( ! Empty( cFor ), GENBLOCK( cFor ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "All", .T.,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( ! Empty( cWhile ), GENBLOCK( cWhile ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ || nMeter += nStep, oPgr:SetPos( nMeter ), SysRefresh() },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nStep, Recno(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "Next", nRecNo,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "Record", nRecNo,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "Rest", .T.,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( lDescend, .T.,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽lTag,, .F., .F., .F., .T., .F., .F. ),;
聽 聽 聽 聽 聽 聽 聽 聽OrdCreate( OrdBagName(), If( lTag, cTag,), cExp, GENBLOCK( cExp ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( lUnique, .T.,) ), oDlg:End() ) 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽

聽 聽@ 9.2, 24 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End() CANCEL
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED

return nil

//----------------------------------------------------------------------------//

function Indexes()

聽 聽local oWnd, oBar, oBrw, oMsgBar
聽 聽local cAlias := Alias(), aIndexes := { Array( 6 ) } 
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Indexes of " + Alias() MDICHILD

聽 聽oWndMain:oBar:AEvalWhen()

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70

聽 聽DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
聽 聽 聽 ACTION ( IndexBuilder(), oBrw:Refresh(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
聽 聽 聽 ACTION ( MsgInfo( "Edit" ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
聽 聽 聽 ACTION If( MsgYesNo( "Want to delete this tag ?" ),;
聽 聽 聽 聽 聽 聽 聽 聽 ( ( cAlias )->( OrdDestroy( oBrw:nArrayAt ) ), oBrw:Refresh() ),)

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report() GROUP
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd ARRAY aIndexes AUTOCOLS LINES ;
聽 聽 聽 HEADERS "Order", "TagName", "Expression", "For", "BagName", "BagExt" ;
聽 聽 聽 COLSIZES 50, 100, 400, 240, 100, 100

聽 聽oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()

聽 聽oBrw:bKeyCount = { || ( cAlias )->( OrdTagsCount() ) }
聽 聽oBrw:aCols[ 1 ]:bStrData = { || oBrw:nArrayAt }
聽 聽oBrw:aCols[ 2 ]:bStrData = { || OrdName( oBrw:nArrayAt ) }
聽 聽oBrw:aCols[ 3 ]:bStrData = { || OrdKey( oBrw:nArrayAt ) }
聽 聽oBrw:aCols[ 4 ]:bStrData = { || OrdFor( oBrw:nArrayAt ) }
聽 聽oBrw:aCols[ 5 ]:bStrData = { || OrdBagName( oBrw:nArrayAt ) }
聽 聽oBrw:aCols[ 6 ]:bStrData = { || OrdBagExt( oBrw:nArrayAt ) }

聽 聽oBrw:SetFocus()
聽 聽
聽 聽oWnd:oClient = oBrw

聽 聽DEFINE MSGBAR oMsgBar 2010
聽 聽
聽 聽ACTIVATE WINDOW oWnd 

return nil

//----------------------------------------------------------------------------//

function ExpBuilder( cExp )

聽 聽local oDlg, oBrw, aFields := DBStruct()
聽 聽local oExp, cFunction
聽 聽
聽 聽cExp = RTrim( cExp )
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Expression builder" SIZE 480, 450
聽 聽
聽 聽@ 0.2, 1.5 SAY "Expression:" SIZE 80, 11 OF oDlg
聽 聽
聽 聽@ 1.1, 1 GET oExp VAR cExp MEMO SIZE 221, 27
聽 聽
聽 聽@ 3, 1.5 SAY "Fields" OF oDlg SIZE 40, 10
聽 聽
聽 聽@ 4, 1 XBROWSE oBrw ARRAY aFields AUTOCOLS LINES SIZE 120, 120 ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 95, 30, 30, 30 
聽 聽 聽 
聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:bLDblClick = { || cExp += oBrw:aRow[ 1 ], oExp:Refresh() } 

聽 聽@ 3, 23.1 SAY "Operators" OF oDlg SIZE 40, 10

聽 聽@ 3.1, 23 BUTTON "=" OF oDlg SIZE 15, 15 ACTION ( cExp += " = ", oExp:Refresh() )

聽 聽@ 3.1, 26.2 BUTTON "<>" OF oDlg SIZE 15, 15 ACTION ( cExp += " <> ", oExp:Refresh() )

聽 聽@ 3.1, 29.4 BUTTON "+" OF oDlg SIZE 15, 15 ACTION ( cExp += " + ", oExp:Refresh() )

聽 聽@ 3.1, 32.6 BUTTON "(" OF oDlg SIZE 15, 15 ACTION ( cExp += " ( ", oExp:Refresh() )

聽 聽@ 3.1, 35.8 BUTTON ".T." OF oDlg SIZE 15, 15 ACTION ( cExp += " .T. ", oExp:Refresh() )

聽 聽@ 4.1, 23 BUTTON "<" OF oDlg SIZE 15, 15 ACTION ( cExp += " < ", oExp:Refresh() )

聽 聽@ 4.1, 26.2 BUTTON ">" OF oDlg SIZE 15, 15 ACTION ( cExp += " > ", oExp:Refresh() )

聽 聽@ 4.1, 29.4 BUTTON "-" OF oDlg SIZE 15, 15 ACTION ( cExp += " - ", oExp:Refresh() )

聽 聽@ 4.1, 32.6 BUTTON ")" OF oDlg SIZE 15, 15 ACTION ( cExp += " )", oExp:Refresh() )

聽 聽@ 4.1, 35.8 BUTTON ".F." OF oDlg SIZE 15, 15 ACTION ( cExp += " .F. ", oExp:Refresh() )

聽 聽@ 5.1, 23 BUTTON "<=" OF oDlg SIZE 15, 15 ACTION ( cExp += " <= ", oExp:Refresh() )

聽 聽@ 5.1, 26.2 BUTTON ">=" OF oDlg SIZE 15, 15 ACTION ( cExp += " >= ", oExp:Refresh() )

聽 聽@ 5.1, 29.4 BUTTON "*" OF oDlg SIZE 15, 15 ACTION ( cExp += " * ", oExp:Refresh() )

聽 聽@ 5.1, 32.6 BUTTON "/" OF oDlg SIZE 15, 15 ACTION ( cExp += " / ", oExp:Refresh() )

聽 聽@ 5.1, 35.8 BUTTON "$" OF oDlg SIZE 15, 15 ACTION ( cExp += " $ ", oExp:Refresh() )

聽 聽@ 6.1, 23 BUTTON '"' OF oDlg SIZE 15, 15 ACTION ( cExp += '"', oExp:Refresh() )

聽 聽@ 6.1, 26.2 BUTTON "!" OF oDlg SIZE 15, 15 ACTION ( cExp += " ! ", oExp:Refresh() )

聽 聽@ 6.1, 29.4 BUTTON "SP" OF oDlg SIZE 15, 15 ACTION ( cExp += " ", oExp:Refresh() )

聽 聽@ 6.1, 32.6 BUTTON "," OF oDlg SIZE 15, 15 ACTION ( cExp += ", ", oExp:Refresh() )

聽 聽@ 6.1, 35.8 BUTTON ":" OF oDlg SIZE 15, 15 ACTION ( cExp += " : ", oExp:Refresh() )

聽 聽@ 7.1, 23 BUTTON "AND" OF oDlg SIZE 27, 15 ACTION ( cExp += " .and. ", oExp:Refresh() )

聽 聽@ 7.1, 28.4 BUTTON "OR" OF oDlg SIZE 27, 15 ACTION ( cExp += " .or. ", oExp:Refresh() )

聽 聽@ 7.1, 33.7 BUTTON "NOT" OF oDlg SIZE 27, 15 ACTION ( cExp += " ! ", oExp:Refresh() )

聽 聽@ 10.3, 23.2 SAY "Functions" OF oDlg SIZE 84, 11

聽 聽@ 11.9, 17.3 COMBOBOX cFunction ITEMS { "AllTrim()", "Left()", "Right()", "SubStr()" } ;
聽 聽 聽 OF oDlg SIZE 92, 80 ON CHANGE ( cExp += Left( cFunction, Len( cFunction ) - 1 ) + " ",;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oExp:Refresh() )

聽 聽@ 11, 13 BUTTON "&Ok" OF oDlg SIZE 45, 13 ACTION oDlg:End()

聽 聽@ 11, 24 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End() CANCEL
聽 聽 聽 聽 聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED

return cExp

//----------------------------------------------------------------------------//

function LoadRecord()

聽 聽local aRecord := {}, n
聽 聽
聽 聽for n = 1 to FCount()
聽 聽 聽 AAdd( aRecord, { FieldName( n ), FieldGet( n ) } )
聽 聽next
聽 聽
return aRecord 聽 聽 聽
聽 聽
//----------------------------------------------------------------------------// 

function Search( oBrw )

聽 聽local oDlg, oCbx, cSearch := Space( 50 )
聽 聽local nRecNo := RecNo(), lInc := .T.
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Search: " + Alias() SIZE 400, 200
聽 聽
聽 聽@ 0.5, 1.5 SAY "Ordered by: " + OrdName() OF oDlg
聽 聽
聽 聽@ 1.2, 1.5 SAY "Key: " + OrdKey() OF oDlg
聽 聽
聽 聽@ 2.4, 1.2 COMBOBOX oCbx VAR cSearch ITEMS aSearches OF oDlg SIZE 180, 150 ;
聽 聽 聽STYLE CBS_DROPDOWN
聽 聽
聽 聽oCbx:oGet:bChange = { || DbSeek( AllTrim( oCbx:GetText() ), lInc ), oBrw:Refresh() } 
聽 聽
聽 聽@ 3.7, 1.5 CHECKBOX lInc PROMPT "&Incremental" OF oDlg SIZE 80, 10
聽 聽
聽 聽@ 4, 7 BUTTON "&Ok" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( If( ! DbSeek( AllTrim( cSearch ), lInc ), DbGoTo( nRecNo ),),;
聽 聽 聽 聽 聽 聽 聽 聽AAdd( aSearches, AllTrim( cSearch ) ), oDlg:End() )

聽 聽@ 4, 18 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End()
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED
聽 聽
return nil 聽 

//----------------------------------------------------------------------------// 

function Relations()

聽 聽local oWnd, oBar, oBrw, aRelations := { Array( 5 ) }, n
聽 聽local nTarget
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Relations of " + Alias() MDICHILD

聽 聽oWndMain:oBar:AEvalWhen()

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70

聽 聽DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
聽 聽 聽 ACTION MsgInfo( "Add" )

聽 聽DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
聽 聽 聽 ACTION ( MsgInfo( "Edit" ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
聽 聽 聽 ACTION MsgInfo( "del" )

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report() GROUP
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd ARRAY aRelations AUTOCOLS LINES ;
聽 聽 聽 HEADERS "Rel.", "Expression", "Child Alias", "Additive", "Scoped" ;
聽 聽 聽 COLSIZES 40, 150, 400, 100, 100

聽 聽oBrw:bKeyCount = { || 8 }
聽 聽oBrw:aCols[ 1 ]:bStrData = { || oBrw:nArrayAt }
聽 聽oBrw:aCols[ 2 ]:bStrData = { || DbRelation( oBrw:nArrayAt ) }
聽 聽oBrw:aCols[ 3 ]:bStrData = { || If( DbRSelect( oBrw:nArrayAt ) != 0,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽Alias( DbRSelect( oBrw:nArrayAt ) ), "" ) }
聽 聽oBrw:aCols[ 4 ]:bStrData = { || ".F." }
聽 聽oBrw:aCols[ 5 ]:bStrData = { || ".F." }

聽 聽oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽
聽 聽oWnd:oClient = oBrw

聽 聽DEFINE MSGBAR oMsgBar 2010

聽 聽ACTIVATE WINDOW oWnd

return nil

//----------------------------------------------------------------------------// 

function SaveRecord( aRecord, nRecNo )

聽 聽local n

聽 聽( Alias() )->( DbGoTo( nRecNo ) )
聽 聽
聽 聽if ( Alias() )->( DbRLock( nRecNo ) )
聽 聽 聽 for n = 1 to Len( aRecord )
聽 聽 聽 聽 聽( Alias() )->( FieldPut( n, aRecord[ n ][ 2 ] ) )
聽 聽 聽 next
聽 聽 聽 ( Alias() )->( DbUnLock() )
聽 聽 聽 MsgInfo( "Record updated" )
聽 聽else
聽 聽 聽 MsgAlert( "Record in use, please try it again" )
聽 聽endif 聽 聽 聽 聽 

return nil 聽 聽 聽

//----------------------------------------------------------------------------// 

function Struct()

聽 聽local oDlg, oBrw, aFields := DbStruct()
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE Alias() + " fields" SIZE 400, 400

聽 聽@ 0, 0 XBROWSE oBrw ARRAY aFields AUTOCOLS LINES ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 150, 50, 80, 80

聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽
聽 聽oBrw:CreateFromCode()
聽 聽 聽 
聽 聽oDlg:oClient = oBrw
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED ;
聽 聽 聽 ON INIT ( BuildStructBar( oDlg, oBrw ), oDlg:Resize(), oBrw:SetFocus() )
聽 聽
return nil 聽 

//----------------------------------------------------------------------------// 

function BuildStructBar( oDlg, oBrw )

聽 聽local oBar

聽 聽DEFINE BUTTONBAR oBar OF oDlg 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Code" RESOURCE "code" ;
聽 聽 聽 ACTION ( TxtStruct(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oDlg:End() GROUP

return nil

//----------------------------------------------------------------------------// 

function TxtStruct()

聽 聽local cCode := "local aFields := { ", n
聽 聽
聽 聽for n = 1 to FCount()
聽 聽 聽 if n > 1
聽 聽 聽 聽 聽cCode += Space( 27 )
聽 聽 聽 endif 聽 
聽 聽 聽 cCode += '{ "' + FieldName( n ) + '", "' + ;
聽 聽 聽 聽 聽 聽 聽 聽FieldType( n ) + '", ' + ;
聽 聽 聽 聽 聽 聽 聽 聽AllTrim( Str( FieldLen( n ) ) ) + ", " + ;
聽 聽 聽 聽 聽 聽 聽 聽AllTrim( Str( FieldDec( n ) ) ) + " },;" + CRLF
聽 聽next
聽 聽
聽 聽cCode = SubStr( cCode, 1, Len( cCode ) - 4 ) + " }"
聽 聽
聽 聽MemoEdit( cCode, "Code" )

return nil

//----------------------------------------------------------------------------// 聽 

function View( cFileName, oWnd )

聽 聽local cExt := Lower( cFileExt( cFileName ) )
聽 聽
聽 聽do case
聽 聽 聽 case cExt == "bmp"
聽 聽 聽 聽 聽 聽WinExec( "mspaint" + " " + cFileName )
聽 聽 聽 聽 聽 聽
聽 聽 聽 case cExt == "txt"
聽 聽 聽 聽 聽 聽WinExec( "notepad" + " " + cFileName ) 聽 聽 
聽 聽 聽 聽 聽 聽
聽 聽 聽 otherwise
聽 聽 聽 聽 聽 聽ShellExecute( oWnd:hWnd, "Open", cFileName )
聽 聽endcase
聽 聽
return nil 聽 聽 聽 聽 聽 聽 聽 聽

//----------------------------------------------------------------------------// 聽 

function New()

聽 聽local oDlg, oGet, oBrw, oBtn
聽 聽local cFieldName := Space( 10 ), cType := "Character", nLen := 10, nDec := 0
聽 聽local aFields := { Array( 4 ) }, cDbfName := Space( 8 ), aTemp
聽 聽local oLen, oDec, aType := { "Character", "Number", "Date", "Logical", "Memo" }
聽 聽local bChange := {|| If( cType == "Character", (nLen := 10, nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Number", 聽 聽(nLen := 10, nDec := 0, oDec:Enable() 聽),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Date", 聽 聽 聽(nLen := 8, 聽nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Logical", 聽 (nLen := 1, 聽nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Memo", 聽 聽 聽(nLen := 10, nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oDlg:Update() }
聽 聽local bEdit := {|| IF ( !Empty (aFields[1,1]) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 (oBtn:Enable (),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽cFieldName := aFields[oBrw:nArrayAt,1] ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽cType := aFields[oBrw:nArrayAt,2] ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽cType := aType[ aScan(aType, {|x| Left(x,1) = cType} )],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽Eval (bChange) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nLen := aFields[oBrw:nArrayAt,3] ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nDec := aFields[oBrw:nArrayAt,4] ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oGet:SetPos( 0 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oGet:SetFocus(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oDlg:Update() ) ,) ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽}
聽 聽local bSave := {|| oBtn:Disable (),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aFields[oBrw:nArrayAt,1] := cFieldname,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aFields[oBrw:nArrayAt,2] := Left (cType,1),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aFields[oBrw:nArrayAt,3] := nLen,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aFields[oBrw:nArrayAt,4] := nDec,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oBrw:SetArray (aFields),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 cFieldName := Space( 10 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Eval (bChange) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oDlg:Update() ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oGet:SetPos( 0 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oGet:SetFocus(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oBrw:GoBottom();
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 }

聽 聽DEFINE DIALOG oDlg TITLE "DBF builder" SIZE 415, 400

聽 聽@ 0.5, 聽2 SAY "Field Name" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 10 SAY "Type" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 17 SAY "Len" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 22 SAY "Dec" OF oDlg SIZE 20, 8

聽 聽@ 1.4, 1 GET oGet VAR cFieldName PICTURE "!!!!!!!!!!" OF oDlg SIZE 41, 11 UPDATE

聽 聽@ 1.3, 6.5 COMBOBOX cType ITEMS aType ;
聽 聽 聽 OF oDlg ON CHANGE Eval (bChange) UPDATE

聽 聽@ 1.4, 11.9 GET oLen VAR nLen PICTURE "999" OF oDlg SIZE 25, 11 UPDATE

聽 聽@ 1.4, 15.4 GET oDec VAR nDec PICTURE "999" OF oDlg SIZE 25, 11 UPDATE

聽 聽@ 0.9, 26 BUTTON "&Add" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION AddField( @aFields, @cFieldName, @cType, @nLen, @nDec, oGet, oBrw )

聽 聽@ 2.4, 26 BUTTON oBtn PROMPT "&Edit" OF oDlg SIZE 45, 13 ;
聽 聽 聽ACTION Eval (bSave)

聽 聽@ 3.4, 26 BUTTON "&Delete" OF oDlg SIZE 45, 13 ;
聽 聽 聽ACTION DelField (@aFields, @cFieldName, oGet, oBrw)

聽 聽@ 4.4, 26 BUTTON "Move &Up" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION If( oBrw:nArrayAt > 1,;
聽 聽 聽 聽 聽 聽 聽 聽 聽( aTemp := aFields[ oBrw:nArrayAt ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt ] := aFields[ oBrw:nArrayAt - 1 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt - 1 ] := aTemp,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:GoUp() ),)

聽 聽@ 5.4, 26 BUTTON "Move D&own" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION If( oBrw:nArrayAt < Len( aFields ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽( aTemp := aFields[ oBrw:nArrayAt ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt ] := aFields[ oBrw:nArrayAt + 1 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt + 1 ] := aTemp,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:GoDown() ),)

聽 聽@ 6.4, 26 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End()

聽 聽@ 2.2, 2 SAY "Fields" OF oDlg SIZE 40, 8

聽 聽@ 3.2, 1 XBROWSE oBrw ARRAY aFields AUTOCOLS ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 90, 55, 40, 40 ;
聽 聽 聽 SIZE 140, 130 OF oDlg ;
聽 聽 聽 ON DBLCLICK Eval (bEdit)

聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } }
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()

聽 聽@ 12.1, 2 SAY "DBF Name:" OF oDlg SIZE 30, 8

聽 聽@ 14, 6 GET cDbfName PICTURE "!!!!!!!!!!!!" OF oDlg SIZE 100, 11

聽 聽@ 10, 26 BUTTON "&Create" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( If( ! Empty( cDbfName ) .and. Len( aFields ) > 0,;
聽 聽 聽 聽 聽 DbCreate( AllTrim( cDbfName ), aFields ),), oDlg:End(),;
聽 聽 聽 聽 聽 Open( hb_CurDrive() + ":\" + CurDir() + "\" + AllTrim( cDbfName ) ) )

聽 聽ACTIVATE DIALOG oDlg CENTERED ON INIT (Eval (bChange), oBtn:Disable() ) ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽VALID !GETKEYSTATE( VK_ESCAPE )

return nil

//----------------------------------------------------------------------------//

function AddField( aFields, cFieldName, cType, nLen, nDec, oGet, oBrw )

聽 聽if Empty( cFieldName )
聽 聽 聽 oGet:SetPos( 0 )
聽 聽 聽 return nil
聽 聽endif

聽 聽if Len( aFields ) == 1 .and. Empty( aFields[ 1 ][ 1 ] )
聽 聽 聽 aFields = { { cFieldName, Upper( Left( cType, 1 ) ), nLen, nDec } }
聽 聽else
聽 聽 聽 AAdd( aFields, { cFieldName, Upper( Left( cType, 1 ) ), nLen, nDec } )
聽 聽endif

聽 聽oBrw:SetArray( aFields )
聽 聽oGet:VarPut( cFieldName := Space( 10 ) )
聽 聽oGet:SetPos( 0 )
聽 聽oGet:SetFocus()
聽 聽oBrw:GoBottom()

return nil
聽 聽 聽 聽 
//----------------------------------------------------------------------------//

function OrdTagsCount()

聽 聽local n, nCount := 0
聽 聽
聽 聽for n = 1 to 100
聽 聽 聽 if ! Empty( OrdKey( n ) )
聽 聽 聽 聽 聽nCount++
聽 聽 聽 endif 聽 
聽 聽next
聽 聽
return nCount 聽 
聽 聽
//----------------------------------------------------------------------------// 聽

function Paste()

聽 聽if oWndMain:oWndActive != nil
聽 聽 聽 oWndMain:oWndActive:Paste()
聽 聽endif 聽 

return nil

//----------------------------------------------------------------------------// 聽

#pragma BEGINDUMP

#include <hbapi.h>
#include <hbapirdd.h>

HB_FUNC( ORDCONDGET )
{
聽 聽AREAP pArea = ( AREAP ) hb_rddGetCurrentWorkAreaPointer();
聽 聽
聽 聽if( pArea )
聽 聽{
聽 聽 聽 LPDBORDERCONDINFO lpdbOrdCondInfo = pArea->lpdbOrdCondInfo;
聽 聽 聽 
聽 聽 聽 if( lpdbOrdCondInfo && lpdbOrdCondInfo->abWhile )
聽 聽 聽 聽 聽hb_retc( lpdbOrdCondInfo->abWhile );
聽 聽 聽 else
聽 聽 聽 聽 聽hb_retc( "" ); 聽 
聽 聽}
聽 聽else
聽 聽 聽 hb_retc( "" ); 聽 聽 
}

#pragma ENDDUMP

//----------------------------------------------------------------------------//
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
Re: FiveDBU para 32/64 bits
Posted: Tue Jun 05, 2012 08:19 PM
Hola Antonio,

fivedbu funciona bien con ADS

solo hay que modificar la apertura del archivo.

USE ( cFileName ) NEW SHARED ;
ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )

de esta forma toma por default el rdd a usar.

Sin embargo, seria interesante mandar un parametro al fivedbu( cFileName, cVia ) )

USE ( cFileName ) NEW SHARED VIA cVia ;
ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )

Saludos y Gracias.
Cesar Cortes Cruz

SysCtrl Software

Mexico



' Sin +- FWH es mejor "
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: FiveDBU para 32/64 bits
Posted: Wed Jun 06, 2012 10:32 AM
C茅sar,

Una versi贸n mejorada con soporte de preferencias de RDD, Ir a registro, Mostrar Rdd en uso, etc. :-)

Code (fw): Select all Collapse
#include "FiveWin.ch"
#include "xbrowse.ch"
#include "dbinfo.ch"

#ifdef __XHARBOUR__
聽 聽#define hb_CurDrive() CurDrive()
#endif 聽 

#define GENBLOCK(x) 聽&( "{ || " + x + " }" )

REQUEST DBFCDX

static oWndMain, oMruDBFs, aSearches := {}, cDefRdd := "DBFCDX"

//----------------------------------------------------------------------------//

function Main( cDbfName )

聽 聽local oBar, oBmpTiled
聽 聽
聽 聽SET DATE FORMAT TO "DD/MM/YYYY"
聽 聽LoadPreferences()

聽 聽SetDlgGradient( { { 1, RGB( 199, 216, 237 ), RGB( 237, 242, 248 ) } } )

聽 聽DEFINE BITMAP oBmpTiled RESOURCE "background"

聽 聽DEFINE WINDOW oWndMain TITLE "FiveDBU" MDI MENU BuildMenu()

聽 聽DEFINE BUTTONBAR oBar OF oWndMain 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "New" RESOURCE "new" ACTION New()

聽 聽DEFINE BUTTON OF oBar PROMPT "Open" RESOURCE "open" ACTION Open()

聽 聽DEFINE BUTTON OF oBar PROMPT "Copy" RESOURCE "copy" ACTION Copy() GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Paste" RESOURCE "paste" ACTION Paste()

聽 聽DEFINE BUTTON OF oBar PROMPT "Prev" RESOURCE "prev" ;
聽 聽 聽 ACTION oWndMain:PrevWindow() GROUP WHEN Len( oWndMain:oWndClient:aWnd ) > 1

聽 聽DEFINE BUTTON OF oBar PROMPT "Next" RESOURCE "next" ;
聽 聽 聽 ACTION oWndMain:NextWindow() WHEN Len( oWndMain:oWndClient:aWnd ) > 1

聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWndMain:End() GROUP

聽 聽DEFINE MSGBAR PROMPT "FiveDBU 32/64 bits, (c) FiveTech Software 2012" ;
聽 聽 聽 OF oWndMain 2010 KEYBOARD DATE

聽 聽if ! Empty( cDbfName )
聽 聽 聽 Open( cDbfName )
聽 聽endif 聽 

聽 聽ACTIVATE WINDOW oWndMain MAXIMIZED ;
聽 聽 聽 VALID MsgYesNo( "Want to end ?" ) ;
聽 聽 聽 ON PAINT DrawTiled( hDC, oWndMain, oBmpTiled )
聽 聽
聽 聽oBmpTiled:End() 聽 聽 聽

return nil

//----------------------------------------------------------------------------//

function BuildMenu()

聽 聽local oMenu
聽 聽
聽 聽MENU oMenu
聽 聽 聽 MENUITEM "Files"
聽 聽 聽 MENU
聽 聽 聽 聽 聽MENUITEM "New..."
聽 聽 聽 聽 聽MENUITEM "Open..." ACTION Open()
聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 聽 聽MENUITEM "Recent files"
聽 聽 聽 聽 聽MENU
聽 聽 聽 聽 聽 聽 MRU oMruDBFs ;
聽 聽 聽 聽 聽 聽 聽 聽FILENAME ".\FiveDBU.ini" ; 聽 聽// .INI to manipulate. '\.' for local
聽 聽 聽 聽 聽 聽 聽 聽SECTION 聽"Recent DBF files" ; // The name of the INI section
聽 聽 聽 聽 聽 聽 聽 聽ACTION 聽 Open( cMruItem ) ; 聽 // cMruItem is automatically provided
聽 聽 聽 聽 聽 聽 聽 聽MESSAGE 聽"Open this file" ; 聽 // The message for all of them
聽 聽 聽 聽 聽 聽 聽 聽SIZE 聽 聽 10
聽 聽 聽 聽 聽ENDMENU 聽 聽 聽 

聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 聽 聽
聽 聽 聽 聽 聽MENUITEM "Preferences..." ACTION Preferences()
聽 聽 聽 聽 聽
聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 聽 聽
聽 聽 聽 聽 聽MENUITEM "Exit" ACTION oWndMain:End()
聽 聽 聽 ENDMENU
聽 聽 聽 
聽 聽 聽 // oMenu:AddEdit()
聽 聽 聽 oMenu:AddMdi()
聽 聽 聽 oMenu:AddHelp( "FiveDBU", "(c) FiveTech Software 2012" )
聽 聽ENDMENU
聽 聽
return oMenu 聽 聽 聽

//----------------------------------------------------------------------------//

function Open( cFileName )

聽 聽local oWnd, oBar, oBrw
聽 聽local oMsgBar, oMsgRecNo, oMsgDeleted, oMsgTagName, oMsgRdd
聽 聽local oPopup, cAlias, n, cClrBack, nTags
聽 聽
聽 聽DEFAULT cFileName := cGetFile( "*.dbf", "Please select a DBF" )
聽 聽
聽 聽if Empty( cFileName )
聽 聽 聽 return nil
聽 聽endif 聽 
聽 聽
聽 聽if ! "." $ cFileName
聽 聽 聽 cFileName += ".dbf"
聽 聽endif 聽 
聽 聽
聽 聽if ! File( cFileName )
聽 聽 聽 MsgStop( "File not found: " + cFileName )
聽 聽 聽 return nil
聽 聽endif
聽 聽
聽 聽if File( cFileNoExt( cFileName ) + ".ntx" )
聽 聽 聽 USE ( cFileName ) VIA "DBFNTX" NEW SHARED ;
聽 聽 聽 聽 聽ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )
聽 聽else 聽 
聽 聽 聽 USE ( cFileName ) VIA cDefRdd NEW SHARED ;
聽 聽 聽 聽 聽ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )
聽 聽 聽 cAlias = Alias()
聽 聽endif 聽 聽 聽 聽
聽 聽
聽 聽oMruDBFs:Save( cFileName )
聽 聽
聽 聽MENU oPopup POPUP
聽 聽 聽 MENUITEM "Natural order" ;
聽 聽 聽 聽 聽ACTION ( ( cAlias )->( DbSetOrder( 0 ) ), oBrw:Refresh(), oBrw:SetFocus(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 ( cAlias )->( Eval( oBrw:bChange ) ) )
聽 聽 聽 
聽 聽 聽 if ( nTags := ( cAlias )->( OrdCount() ) ) > 0
聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 endif 聽 
聽 聽 聽 
聽 聽 聽 for n = 1 to nTags
聽 聽 聽 聽 聽if ! Empty( OrdName( n ) )
聽 聽 聽 聽 聽 聽 if ! Empty( OrdName( 1 ) )
聽 聽 聽 聽 聽 聽 聽 聽DbSetOrder( OrdName( 1 ) )
聽 聽 聽 聽 聽 聽 聽 聽DbGoTop()
聽 聽 聽 聽 聽 聽 endif 聽 
聽 聽 聽 聽 聽 聽 MENUITEM OrdName( n ) ;
聽 聽 聽 聽 聽 聽 聽 聽ACTION ( ( cAlias )->( DbSetOrder( oMenuItem:cPrompt ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oBrw:Refresh(), ( cAlias )->( Eval( oBrw:bChange ) ), oBrw:SetFocus() )
聽 聽 聽 聽 聽endif
聽 聽 聽 next 聽 聽
聽 聽ENDMENU 聽 
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Browse " + cAlias MDICHILD

聽 聽oWnd:bCopy = { || MsgInfo( "copy" ) }

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
聽 聽 聽 ACTION ( ( oBrw:cAlias )->( DbAppend() ), oBrw:Refresh(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
聽 聽 聽 ACTION ( oBrw:cAlias )->( Edit() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
聽 聽 聽 ACTION ( obrw:cAlias )->( DelRecord( oBrw, oMsgDeleted ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Search" RESOURCE "search" ;
聽 聽 聽 GROUP ACTION ( cAlias )->( Search( oBrw ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Index" RESOURCE "index" ;
聽 聽 聽 MENU oPopup ACTION ( cAlias )->( Indexes() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Relations" RESOURCE "relation" ;
聽 聽 聽 ACTION ( cAlias )->( Relations() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Top" RESOURCE "top" ;
聽 聽 聽 ACTION ( oBrw:GoTop(), oBrw:SetFocus() ) GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Bottom" RESOURCE "bottom" ;
聽 聽 聽 ACTION ( oBrw:GoBottom(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Struct" RESOURCE "struct" ;
聽 聽 聽 ACTION ( oBrw:cAlias )->( Struct() ) GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report()

聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd LINES ;
聽 聽 聽 ON CHANGE ( oMsgBar:cMsgDef := "FileName: " + cFileName,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgBar:Refresh(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgRecNo:SetText( "RecNo: " + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 AllTrim( Str( ( cAlias )->( RecNo() ) ) ) + " / " + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 AllTrim( Str( ( cAlias )->( RecCount() ) ) ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgTagName:SetText( "Ordered by: " + If( ! Empty( OrdName() ), OrdName(), "Natural order" ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgDeleted:SetText( If( ( oBrw:cAlias )->( Deleted() ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"DELETED", "NON DELETED" ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgDeleted:SetBitmap( If( ( oBrw:cAlias )->( Deleted() ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"deleted", "nondeleted" ) ) )

聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_BLACK ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_BLACK ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_WHITE ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 0x33, 0x66, 0xCC ) } }
聽 聽cClrBack = Eval( oBrw:bClrSelFocus )[ 2 ] 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:bClrSelFocus = { || { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_WHITE ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 cClrBack } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽oBrw:bLDblClick = { || ( oBrw:cAlias )->( Edit() ) } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽
聽 聽oWnd:oClient = oBrw
聽 聽oWnd:oControl = oBrw

聽 聽DEFINE MSGBAR oMsgBar PROMPT "FileName: " + cFileName OF oWnd 2010 

聽 聽DEFINE MSGITEM oMsgRecNo OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT "RecNo: " + ;
聽 聽 聽 聽 聽 AllTrim( Str( RecNo() ) ) + " / " + ;
聽 聽 聽 聽 聽 AllTrim( Str( RecCount() ) ) ;
聽 聽 聽 聽 聽 SIZE 150 ;
聽 聽 聽 聽 聽 ACTION ( cAlias )->( DlgGoTo( oBrw ) )

聽 聽DEFINE MSGITEM oMsgDeleted OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT If( ( oBrw:cAlias )->( Deleted() ), "DELETED", "NON DELETED" ) ;
聽 聽 聽 聽 聽 SIZE 120 ;
聽 聽 聽 聽 聽 BITMAPS "nondeleted" ;
聽 聽 聽 聽 聽 ACTION ( oBrw:cAlias )->( DelRecord( oBrw, oMsgDeleted ) ) 聽 

聽 聽DEFINE MSGITEM oMsgTagName OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT "Ordered by: " + ;
聽 聽 聽 聽 聽 If( ! Empty( ( oBrw:cAlias )->( OrdName() ) ),;
聽 聽 聽 聽 聽 聽 聽 ( oBrw:cAlias )->( OrdName() ), "Natural order" ) ;
聽 聽 聽 聽 聽 SIZE 150

聽 聽DEFINE MSGITEM oMsgRdd OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT "Rdd: " + ( cAlias )->( RddName() ) ;
聽 聽 聽 聽 聽 SIZE 120
聽 聽 聽 聽 聽 
聽 聽ACTIVATE WINDOW oWnd ;
聽 聽 聽 VALID ( ( cAlias )->( DbCloseArea() ), oBrw:cAlias := "", .T. )
聽 聽
return nil 聽 

//----------------------------------------------------------------------------//

function Copy()

聽 聽if oWndMain:oWndActive != nil
聽 聽 聽 oWndMain:oWndActive:Copy()
聽 聽endif 聽 

return nil

//----------------------------------------------------------------------------//
聽 
function DelField( aFields, cFieldName, oGet, oBrw )

聽 聽if Len( aFields ) >= 1
聽 聽 聽 ADel( aFields, oBrw:nArrayAt, .T. )
聽 聽 聽 oBrw:SetArray( aFields )
聽 聽endif

聽 聽oGet:VarPut( cFieldName := Space( 10 ) )
聽 聽oGet:SetPos( 0 )
聽 聽oGet:SetFocus()
聽 聽oBrw:GoBottom()
聽 聽 聽 聽 聽 聽 聽 聽
return nil

//----------------------------------------------------------------------------//
聽 聽 聽 聽
function DelRecord( oBrw, oMsgDeleted )

聽 聽if ! Deleted() 
聽 聽 聽 if ! MsgYesNo( "Want to delete this record ?" )
聽 聽 聽 聽 聽return nil
聽 聽 聽 endif 聽 
聽 聽 聽 DbRLock() 聽 
聽 聽 聽 DbDelete() 聽 
聽 聽 聽 DbUnlock() 聽 
聽 聽 聽 oMsgDeleted:SetText( "DELETED" )
聽 聽 聽 oMsgDeleted:SetBitmap( "deleted" )
聽 聽else
聽 聽 聽 DbRLock() 聽 
聽 聽 聽 DbRecall() 聽 
聽 聽 聽 DbUnlock() 聽 聽 聽 聽 
聽 聽 聽 oMsgDeleted:SetText( "NON DELETED" )
聽 聽 聽 oMsgDeleted:SetBitmap( "nondeleted" )
聽 聽 聽 MsgInfo( "UnDeleted record" )
聽 聽endif
聽 聽
聽 聽Eval( oBrw:bChange )
聽 聽oBrw:Refresh()

return nil 聽 

//----------------------------------------------------------------------------//

function DlgGoTo( oBrw )

聽 聽local oDlg, nRecNo := RecNo()
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE Alias() + " go to record" SIZE 400, 200

聽 聽@ 1.2, 1.5 SAY "Current record: " + AllTrim( Str( RecNo() ) ) + ;
聽 聽 聽 " / " + AllTrim( Str( RecCount() ) ) OF oDlg
聽 聽
聽 聽@ 2.4, 1.2 GET nRecNo OF oDlg SIZE 180, 11
聽 聽
聽 聽@ 4, 7 BUTTON "&Ok" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( DbGoTo( nRecNo ), oBrw:Refresh(), oDlg:End() )

聽 聽@ 4, 18 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End()
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED
聽 聽
return nil 聽 

//----------------------------------------------------------------------------//
聽 聽
function Edit()

聽 聽local oWnd, aRecord := ( Alias() )->( LoadRecord() ), oBar, oBrw, oMsgBar
聽 聽local cAlias := Alias(), oBtnSave, nRecNo := ( Alias() )->( RecNo() )
聽 聽local oMsgDeleted
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Edit " + Alias() MDICHILD

聽 聽oWndMain:oBar:AEvalWhen()

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON oBtnSave OF oBar PROMPT "Save" RESOURCE "save" ;
聽 聽 聽 ACTION ( ( cAlias )->( SaveRecord( aRecord, nRecNo ) ), oBtnSave:Disable() )

聽 聽oBtnSave:Disable()

聽 聽DEFINE BUTTON OF oBar PROMPT "Prev" RESOURCE "prev" ;
聽 聽 聽 ACTION GoPrevRecord( oBrw, aRecord, oMsgDeleted ) GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "Next" RESOURCE "next" ;
聽 聽 聽 ACTION GoNextRecord( oBrw, aRecord, oMsgDeleted ) 

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report() GROUP

聽 聽DEFINE BUTTON OF oBar PROMPT "View" RESOURCE "view" ;
聽 聽 聽 ACTION View( oBrw:aRow[ 2 ], oWnd )
聽 聽 聽 
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd ARRAY aRecord AUTOCOLS LINES ;
聽 聽 聽 HEADERS "FieldName", "Value" COLSIZES 150, 400 FASTEDIT ;
聽 聽 聽 ON CHANGE ( ( cAlias )->( SetEditType( oBrw, oBtnSave ) ), oBrw:DrawLine( .T. ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 oMsgBar:cMsgDef := " RecNo: " + AllTrim( Str( ( cAlias )->( RecNo() ) ) ) + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"/" + AllTrim( Str( ( cAlias )->( RecCount() ) ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 oMsgBar:Refresh() ) 聽 聽 聽 聽 聽 聽 聽 聽 

聽 聽oBrw:nEditTypes = EDIT_GET
聽 聽oBrw:aCols[ 1 ]:nEditType = 0 // Don't allow to edit first column
聽 聽oBrw:aCols[ 2 ]:bOnChange = { || oBtnSave:Enable() }
聽 聽oBrw:aCols[ 2 ]:lWillShowABtn = .T.
聽 聽oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽
聽 聽oWnd:oClient = oBrw

聽 聽DEFINE MSGBAR oMsgBar ;
聽 聽 聽 PROMPT " RecNo: " + AllTrim( Str( ( cAlias )->( RecNo() ) ) ) + "/" + ;
聽 聽 聽 AllTrim( Str( ( cAlias )->( RecCount() ) ) ) OF oWnd 2010

聽 聽DEFINE MSGITEM oMsgDeleted OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT If( ( cAlias )->( Deleted() ), "DELETED", "NON DELETED" ) ;
聽 聽 聽 聽 聽 SIZE 130 ;
聽 聽 聽 聽 聽 BITMAPS If( ( cAlias )->( Deleted() ), "deleted", "nondeleted" ) ;
聽 聽 聽 聽 聽 ACTION ( cAlias )->( DelRecord( oBrw, oMsgDeleted ) ) 聽 
聽 聽
聽 聽ACTIVATE WINDOW oWnd
聽 聽
return nil 聽 聽 聽

//----------------------------------------------------------------------------//

function GoPrevRecord( oBrw, aRecord, oMsgDeleted )

聽 聽DbSkip( -1 )
聽 聽
聽 聽oBrw:SetArray( aRecord := LoadRecord() )
聽 聽oBrw:SetFocus()
聽 聽Eval( oBrw:bChange )

聽 聽oMsgDeleted:SetText( If( Deleted(), "DELETED", "NON DELETED" ) )
聽 聽oMsgDeleted:SetBitmap( If( Deleted(), "deleted", "nondeleted" ) )
聽 聽
return nil

//----------------------------------------------------------------------------//

function GoNextRecord( oBrw, aRecord, oMsgDeleted )

聽 聽DbSkip( 1 )
聽 聽
聽 聽If Eof()
聽 聽 聽 DbSkip( -1 )
聽 聽else
聽 聽 聽 oBrw:SetArray( aRecord := LoadRecord() )
聽 聽 聽 oBrw:SetFocus()
聽 聽 聽 Eval( oBrw:bChange )
聽 聽endif 聽 

聽 聽oMsgDeleted:SetText( If( Deleted(), "DELETED", "NON DELETED" ) )
聽 聽oMsgDeleted:SetBitmap( If( Deleted(), "deleted", "nondeleted" ) )
聽 聽
return nil

//----------------------------------------------------------------------------//

function SetEditType( oBrw, oBtnSave )

聽 聽local cType := FieldType( oBrw:nArrayAt )
聽 聽
聽 聽do case
聽 聽 聽 case cType == "M"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_BUTTON
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:bEditBlock = { | c | c := oBrw:aRow[ 2 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽MemoEdit( @oBrw:aRow[ 2 ], FieldName( oBrw:nArrayAt ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( ! c == oBrw:aRow[ 2 ], oBtnSave:Enable(),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:aRow[ 2 ] }
聽 聽
聽 聽 聽 case cType == "D"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_BUTTON
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:bEditBlock = { || If( ! Empty( oBrw:aRow[ 2 ] ) .and. ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽! AllTrim( oBrw:aRow[ 2 ] ) == "/ 聽/",;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽DToC( MsgDate( CtoD( oBrw:aRow[ 2 ] ) ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽DToC( MsgDate( Date() ) ) ) }
聽 聽
聽 聽 聽 case cType == "L"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_LISTBOX
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:aEditListTxt 聽 = { ".T.", ".F." }
聽 聽 聽 聽 聽 聽
聽 聽 聽 otherwise
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_GET
聽 聽endcase
聽 聽
return nil 聽 聽 聽 聽 聽 聽 聽

//----------------------------------------------------------------------------//

function IndexBuilder()

聽 聽local oDlg, cExp := Space( 80 ), cTo := Space( 80 ), cTag := Space( 20 )
聽 聽local cFor := Space( 80 ), cWhile := Space( 80 ), lUnique := .F.
聽 聽local lDescend := .F., lMemory := .F., cScope := "All", nRecNo
聽 聽local oPgr, nMeter := 0, nStep := 10, lTag := .T. 
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Index builder" SIZE 530, 380 

聽 聽@ 0.4, 3 SAY "Expression:" OF oDlg SIZE 40, 8

聽 聽@ 0.5, 6 GET cExp OF oDlg SIZE 200, 11 ACTION ExpBuilder( @cExp ) ;
聽 聽 聽 VALID ! Empty( cExp )
聽 聽
聽 聽@ 1.5, 6 SAY "To:" OF oDlg SIZE 40, 8

聽 聽@ 1.7, 6 GET cTo OF oDlg SIZE 200, 11

聽 聽@ 2.6, 5.5 SAY "Tag:" OF oDlg SIZE 40, 8

聽 聽@ 聽 3, 6 GET cTag OF oDlg SIZE 100, 11
聽 聽
聽 聽@ 3.7, 5.9 SAY "For:" OF oDlg SIZE 40, 8

聽 聽@ 4.3, 6 GET cFor OF oDlg SIZE 200, 11 ACTION ExpBuilder()

聽 聽@ 4.8, 5 SAY "While:" OF oDlg SIZE 40, 8

聽 聽@ 5.6, 6 GET cWhile OF oDlg SIZE 200, 11 ACTION ExpBuilder()
聽 聽
聽 聽@ 6.8, 6.9 CHECKBOX lUnique PROMPT "&Unique" OF oDlg SIZE 50, 8

聽 聽@ 6.8, 13.9 CHECKBOX lDescend PROMPT "&Descending" OF oDlg SIZE 80, 8

聽 聽@ 6.8, 23 CHECKBOX lMemory PROMPT "&Memory" OF oDlg SIZE 80, 8

聽 聽@ 6.8, 8 SAY "Scope:" OF oDlg SIZE 40, 8
聽 聽
聽 聽@ 8.2, 6 COMBOBOX cScope ITEMS { "All", "Next", "Record", "Rest" } OF oDlg

聽 聽@ 6.8, 16.1 SAY "Record:" OF oDlg SIZE 40, 8

聽 聽@ 8.8, 12.1 GET nRecNo OF oDlg SIZE 30, 11

聽 聽@ 8.5, 8 SAY "Progress:" OF oDlg SIZE 40, 8
聽 聽
聽 聽@ 9.2, 8 PROGRESS oPgr OF oDlg SIZE 200, 10
聽 聽
聽 聽@ 9.2, 13 BUTTON "C&reate" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( OrdCondSet( If( ! Empty( cFor ), cFor,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( ! Empty( cFor ), GENBLOCK( cFor ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "All", .T.,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( ! Empty( cWhile ), GENBLOCK( cWhile ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ || nMeter += nStep, oPgr:SetPos( nMeter ), SysRefresh() },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nStep, Recno(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "Next", nRecNo,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "Record", nRecNo,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( cScope == "Rest", .T.,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( lDescend, .T.,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽lTag,, .F., .F., .F., .T., .F., .F. ),;
聽 聽 聽 聽 聽 聽 聽 聽OrdCreate( OrdBagName(), If( lTag, cTag,), cExp, GENBLOCK( cExp ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( lUnique, .T.,) ), oDlg:End() ) 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽

聽 聽@ 9.2, 24 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End() CANCEL
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED

return nil

//----------------------------------------------------------------------------//

function Indexes()

聽 聽local oWnd, oBar, oBrw, oMsgBar
聽 聽local cAlias := Alias(), aIndexes := Array( OrdCount() )
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Indexes of " + Alias() MDICHILD

聽 聽oWndMain:oBar:AEvalWhen()

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70

聽 聽DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
聽 聽 聽 ACTION ( IndexBuilder(), oBrw:Refresh(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
聽 聽 聽 ACTION ( MsgInfo( "Edit" ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
聽 聽 聽 ACTION If( MsgYesNo( "Want to delete this tag ?" ),;
聽 聽 聽 聽 聽 聽 聽 聽 ( ( cAlias )->( OrdDestroy( oBrw:nArrayAt ) ), oBrw:Refresh() ),)

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report() GROUP
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd ARRAY aIndexes AUTOCOLS LINES ;
聽 聽 聽 HEADERS "Order", "TagName", "Expression", "For", "BagName", "BagExt" ;
聽 聽 聽 COLUMNS { || oBrw:nArrayAt },;
聽 聽 聽 聽 聽 聽 聽 { || ( cAlias )->( OrdName( oBrw:nArrayAt ) ) },;
聽 聽 聽 聽 聽 聽 聽 { || ( cAlias )->( OrdKey ( oBrw:nArrayAt ) ) },;
聽 聽 聽 聽 聽 聽 聽 { || ( cAlias )->( OrdFor ( oBrw:nArrayAt ) ) },;
聽 聽 聽 聽 聽 聽 聽 { || ( cAlias )->( OrdBagName( oBrw:nArrayAt ) ) } ;
聽 聽 聽 COLSIZES 50, 100, 400, 240, 100, 100

聽 聽oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()

聽 聽oBrw:SetFocus()
聽 聽
聽 聽oWnd:oClient = oBrw

聽 聽DEFINE MSGBAR oMsgBar 2010
聽 聽
聽 聽ACTIVATE WINDOW oWnd 

return nil

//----------------------------------------------------------------------------//

function ExpBuilder( cExp )

聽 聽local oDlg, oBrw, aFields := DBStruct()
聽 聽local oExp, cFunction
聽 聽
聽 聽cExp = RTrim( cExp )
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Expression builder" SIZE 480, 450
聽 聽
聽 聽@ 0.2, 1.5 SAY "Expression:" SIZE 80, 11 OF oDlg
聽 聽
聽 聽@ 1.1, 1 GET oExp VAR cExp MEMO SIZE 221, 27
聽 聽
聽 聽@ 3, 1.5 SAY "Fields" OF oDlg SIZE 40, 10
聽 聽
聽 聽@ 4, 1 XBROWSE oBrw ARRAY aFields AUTOCOLS LINES SIZE 120, 120 ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 95, 30, 30, 30 
聽 聽 聽 
聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:bLDblClick = { || cExp += oBrw:aRow[ 1 ], oExp:Refresh() } 

聽 聽@ 3, 23.1 SAY "Operators" OF oDlg SIZE 40, 10

聽 聽@ 3.1, 23 BUTTON "=" OF oDlg SIZE 15, 15 ACTION ( cExp += " = ", oExp:Refresh() )

聽 聽@ 3.1, 26.2 BUTTON "<>" OF oDlg SIZE 15, 15 ACTION ( cExp += " <> ", oExp:Refresh() )

聽 聽@ 3.1, 29.4 BUTTON "+" OF oDlg SIZE 15, 15 ACTION ( cExp += " + ", oExp:Refresh() )

聽 聽@ 3.1, 32.6 BUTTON "(" OF oDlg SIZE 15, 15 ACTION ( cExp += " ( ", oExp:Refresh() )

聽 聽@ 3.1, 35.8 BUTTON ".T." OF oDlg SIZE 15, 15 ACTION ( cExp += " .T. ", oExp:Refresh() )

聽 聽@ 4.1, 23 BUTTON "<" OF oDlg SIZE 15, 15 ACTION ( cExp += " < ", oExp:Refresh() )

聽 聽@ 4.1, 26.2 BUTTON ">" OF oDlg SIZE 15, 15 ACTION ( cExp += " > ", oExp:Refresh() )

聽 聽@ 4.1, 29.4 BUTTON "-" OF oDlg SIZE 15, 15 ACTION ( cExp += " - ", oExp:Refresh() )

聽 聽@ 4.1, 32.6 BUTTON ")" OF oDlg SIZE 15, 15 ACTION ( cExp += " )", oExp:Refresh() )

聽 聽@ 4.1, 35.8 BUTTON ".F." OF oDlg SIZE 15, 15 ACTION ( cExp += " .F. ", oExp:Refresh() )

聽 聽@ 5.1, 23 BUTTON "<=" OF oDlg SIZE 15, 15 ACTION ( cExp += " <= ", oExp:Refresh() )

聽 聽@ 5.1, 26.2 BUTTON ">=" OF oDlg SIZE 15, 15 ACTION ( cExp += " >= ", oExp:Refresh() )

聽 聽@ 5.1, 29.4 BUTTON "*" OF oDlg SIZE 15, 15 ACTION ( cExp += " * ", oExp:Refresh() )

聽 聽@ 5.1, 32.6 BUTTON "/" OF oDlg SIZE 15, 15 ACTION ( cExp += " / ", oExp:Refresh() )

聽 聽@ 5.1, 35.8 BUTTON "$" OF oDlg SIZE 15, 15 ACTION ( cExp += " $ ", oExp:Refresh() )

聽 聽@ 6.1, 23 BUTTON '"' OF oDlg SIZE 15, 15 ACTION ( cExp += '"', oExp:Refresh() )

聽 聽@ 6.1, 26.2 BUTTON "!" OF oDlg SIZE 15, 15 ACTION ( cExp += " ! ", oExp:Refresh() )

聽 聽@ 6.1, 29.4 BUTTON "SP" OF oDlg SIZE 15, 15 ACTION ( cExp += " ", oExp:Refresh() )

聽 聽@ 6.1, 32.6 BUTTON "," OF oDlg SIZE 15, 15 ACTION ( cExp += ", ", oExp:Refresh() )

聽 聽@ 6.1, 35.8 BUTTON ":" OF oDlg SIZE 15, 15 ACTION ( cExp += " : ", oExp:Refresh() )

聽 聽@ 7.1, 23 BUTTON "AND" OF oDlg SIZE 27, 15 ACTION ( cExp += " .and. ", oExp:Refresh() )

聽 聽@ 7.1, 28.4 BUTTON "OR" OF oDlg SIZE 27, 15 ACTION ( cExp += " .or. ", oExp:Refresh() )

聽 聽@ 7.1, 33.7 BUTTON "NOT" OF oDlg SIZE 27, 15 ACTION ( cExp += " ! ", oExp:Refresh() )

聽 聽@ 10.3, 23.2 SAY "Functions" OF oDlg SIZE 84, 11

聽 聽@ 11.9, 17.3 COMBOBOX cFunction ITEMS { "AllTrim()", "Left()", "Right()", "SubStr()" } ;
聽 聽 聽 OF oDlg SIZE 92, 80 ON CHANGE ( cExp += Left( cFunction, Len( cFunction ) - 1 ) + " ",;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oExp:Refresh() )

聽 聽@ 11, 13 BUTTON "&Ok" OF oDlg SIZE 45, 13 ACTION oDlg:End()

聽 聽@ 11, 24 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End() CANCEL
聽 聽 聽 聽 聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED

return cExp

//----------------------------------------------------------------------------//

function LoadRecord()

聽 聽local aRecord := {}, n
聽 聽
聽 聽for n = 1 to FCount()
聽 聽 聽 AAdd( aRecord, { FieldName( n ), FieldGet( n ) } )
聽 聽next
聽 聽
return aRecord 聽 聽 聽
聽 聽
//----------------------------------------------------------------------------// 

function Search( oBrw )

聽 聽local oDlg, oCbx, cSearch := Space( 50 )
聽 聽local nRecNo := RecNo(), lInc := .T.
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Search: " + Alias() SIZE 400, 200
聽 聽
聽 聽@ 0.5, 1.5 SAY "Ordered by: " + OrdName() OF oDlg
聽 聽
聽 聽@ 1.2, 1.5 SAY "Key: " + OrdKey() OF oDlg
聽 聽
聽 聽@ 2.4, 1.2 COMBOBOX oCbx VAR cSearch ITEMS aSearches OF oDlg SIZE 180, 150 ;
聽 聽 聽STYLE CBS_DROPDOWN
聽 聽
聽 聽oCbx:oGet:bChange = { || DbSeek( AllTrim( oCbx:GetText() ), lInc ), oBrw:Refresh() } 
聽 聽
聽 聽@ 3.7, 1.5 CHECKBOX lInc PROMPT "&Incremental" OF oDlg SIZE 80, 10
聽 聽
聽 聽@ 4, 7 BUTTON "&Ok" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( If( ! DbSeek( AllTrim( cSearch ), lInc ), DbGoTo( nRecNo ),),;
聽 聽 聽 聽 聽 聽 聽 聽AAdd( aSearches, AllTrim( cSearch ) ), oDlg:End() )

聽 聽@ 4, 18 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End()
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED
聽 聽
return nil 聽 

//----------------------------------------------------------------------------// 

function Preferences()

聽 聽local oDlg
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Preferences" SIZE 400, 200

聽 聽@ 1.2, 1.5 SAY "Default RDD: " + cDefRdd OF oDlg
聽 聽
聽 聽@ 2.4, 1.2 COMBOBOX cDefRdd ITEMS { "DBFNTX", "DBFCDX", "RDDADS" } ;
聽 聽 聽 OF oDlg SIZE 180, 150
聽 聽
聽 聽@ 4, 7 BUTTON "&Ok" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( SavePreferences(), oDlg:End() )

聽 聽@ 4, 18 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End()
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED
聽 聽
return nil 聽 

//----------------------------------------------------------------------------//

function Relations()

聽 聽local oWnd, oBar, oBrw, aRelations := Array( 8 ), oMsgBar
聽 聽local nTarget, cAlias := Alias()
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Relations of " + Alias() MDICHILD

聽 聽oWndMain:oBar:AEvalWhen()

聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70

聽 聽DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
聽 聽 聽 ACTION MsgInfo( "Add" )

聽 聽DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
聽 聽 聽 ACTION ( MsgInfo( "Edit" ) )

聽 聽DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
聽 聽 聽 ACTION MsgInfo( "del" )

聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report() GROUP
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWnd:End() GROUP

聽 聽@ 0, 0 XBROWSE oBrw OF oWnd ARRAY aRelations AUTOCOLS LINES ;
聽 聽 聽 HEADERS "Rel.", "Expression", "Child Alias", "Additive", "Scoped" ;
聽 聽 聽 COLUMNS { || oBrw:nArrayAt },;
聽 聽 聽 聽 聽 聽 聽 { || ( cAlias )->( DbRelation( oBrw:nArrayAt ) ) },;
聽 聽 聽 聽 聽 聽 聽 { || If( ( cAlias )->( DbRSelect( oBrw:nArrayAt ) ) != 0,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽Alias( ( cAlias )->( DbRSelect( oBrw:nArrayAt ) ) ), "" ) },;
聽 聽 聽 聽 聽 聽 聽 { || ".F." }, { || ".F." } ; 聽 聽 
聽 聽 聽 COLSIZES 40, 150, 400, 100, 100

聽 聽oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽
聽 聽oWnd:oClient = oBrw

聽 聽DEFINE MSGBAR oMsgBar 2010

聽 聽ACTIVATE WINDOW oWnd

return nil

//----------------------------------------------------------------------------// 

function LoadPreferences()

聽 聽local oIni

聽 聽if File( "./fivedbu.ini" )
聽 聽 聽 INI oIni FILE "./fivedbu.ini"
聽 聽 聽 聽 聽GET cDefRdd SECTION "Default" ENTRY "RDD" OF oIni
聽 聽 聽 ENDINI 聽 聽 聽
聽 聽endif 聽 

return nil

//----------------------------------------------------------------------------// 

function SavePreferences()

聽 聽local oIni

聽 聽INI oIni FILE "./fivedbu.ini"
聽 聽 聽 SET SECTION "Default" ENTRY "RDD" OF oIni TO cDefRdd
聽 聽ENDINI 聽 聽 聽

return nil

//----------------------------------------------------------------------------// 

function SaveRecord( aRecord, nRecNo )

聽 聽local n

聽 聽( Alias() )->( DbGoTo( nRecNo ) )
聽 聽
聽 聽if ( Alias() )->( DbRLock( nRecNo ) )
聽 聽 聽 for n = 1 to Len( aRecord )
聽 聽 聽 聽 聽( Alias() )->( FieldPut( n, aRecord[ n ][ 2 ] ) )
聽 聽 聽 next
聽 聽 聽 ( Alias() )->( DbUnLock() )
聽 聽 聽 MsgInfo( "Record updated" )
聽 聽else
聽 聽 聽 MsgAlert( "Record in use, please try it again" )
聽 聽endif 聽 聽 聽 聽 

return nil 聽 聽 聽

//----------------------------------------------------------------------------// 

function Struct()

聽 聽local oDlg, oBrw, aFields := DbStruct()
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE Alias() + " fields" SIZE 400, 400

聽 聽@ 0, 0 XBROWSE oBrw ARRAY aFields AUTOCOLS LINES ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 150, 50, 80, 80

聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽 
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽
聽 聽oBrw:CreateFromCode()
聽 聽 聽 
聽 聽oDlg:oClient = oBrw
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED ;
聽 聽 聽 ON INIT ( BuildStructBar( oDlg, oBrw ), oDlg:Resize(), oBrw:SetFocus() )
聽 聽
return nil 聽 

//----------------------------------------------------------------------------// 

function BuildStructBar( oDlg, oBrw )

聽 聽local oBar

聽 聽DEFINE BUTTONBAR oBar OF oDlg 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Code" RESOURCE "code" ;
聽 聽 聽 ACTION ( TxtStruct(), oBrw:SetFocus() )

聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oDlg:End() GROUP

return nil

//----------------------------------------------------------------------------// 

function TxtStruct()

聽 聽local cCode := "local aFields := { ", n
聽 聽
聽 聽for n = 1 to FCount()
聽 聽 聽 if n > 1
聽 聽 聽 聽 聽cCode += Space( 27 )
聽 聽 聽 endif 聽 
聽 聽 聽 cCode += '{ "' + FieldName( n ) + '", "' + ;
聽 聽 聽 聽 聽 聽 聽 聽FieldType( n ) + '", ' + ;
聽 聽 聽 聽 聽 聽 聽 聽AllTrim( Str( FieldLen( n ) ) ) + ", " + ;
聽 聽 聽 聽 聽 聽 聽 聽AllTrim( Str( FieldDec( n ) ) ) + " },;" + CRLF
聽 聽next
聽 聽
聽 聽cCode = SubStr( cCode, 1, Len( cCode ) - 4 ) + " }"
聽 聽
聽 聽MemoEdit( cCode, "Code" )

return nil

//----------------------------------------------------------------------------// 聽 

function View( cFileName, oWnd )

聽 聽local cExt := Lower( cFileExt( cFileName ) )
聽 聽
聽 聽do case
聽 聽 聽 case cExt == "bmp"
聽 聽 聽 聽 聽 聽WinExec( "mspaint" + " " + cFileName )
聽 聽 聽 聽 聽 聽
聽 聽 聽 case cExt == "txt"
聽 聽 聽 聽 聽 聽WinExec( "notepad" + " " + cFileName ) 聽 聽 
聽 聽 聽 聽 聽 聽
聽 聽 聽 otherwise
聽 聽 聽 聽 聽 聽ShellExecute( oWnd:hWnd, "Open", cFileName )
聽 聽endcase
聽 聽
return nil 聽 聽 聽 聽 聽 聽 聽 聽

//----------------------------------------------------------------------------// 聽 

function New()

聽 聽local oDlg, oGet, oBrw, oBtn
聽 聽local cFieldName := Space( 10 ), cType := "Character", nLen := 10, nDec := 0
聽 聽local aFields := { Array( 4 ) }, cDbfName := Space( 8 ), aTemp
聽 聽local oLen, oDec, aType := { "Character", "Number", "Date", "Logical", "Memo" }
聽 聽local bChange := {|| If( cType == "Character", (nLen := 10, nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Number", 聽 聽(nLen := 10, nDec := 0, oDec:Enable() 聽),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Date", 聽 聽 聽(nLen := 8, 聽nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Logical", 聽 (nLen := 1, 聽nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Memo", 聽 聽 聽(nLen := 10, nDec := 0, oDec:Disable() ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oDlg:Update() }
聽 聽local bEdit := {|| IF ( !Empty (aFields[1,1]) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 (oBtn:Enable (),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽cFieldName := aFields[oBrw:nArrayAt,1] ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽cType := aFields[oBrw:nArrayAt,2] ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽cType := aType[ aScan(aType, {|x| Left(x,1) = cType} )],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽Eval (bChange) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nLen := aFields[oBrw:nArrayAt,3] ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nDec := aFields[oBrw:nArrayAt,4] ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oGet:SetPos( 0 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oGet:SetFocus(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oDlg:Update() ) ,) ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽}
聽 聽local bSave := {|| oBtn:Disable (),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aFields[oBrw:nArrayAt,1] := cFieldname,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aFields[oBrw:nArrayAt,2] := Left (cType,1),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aFields[oBrw:nArrayAt,3] := nLen,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aFields[oBrw:nArrayAt,4] := nDec,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oBrw:SetArray (aFields),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 cFieldName := Space( 10 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Eval (bChange) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oDlg:Update() ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oGet:SetPos( 0 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oGet:SetFocus(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oBrw:GoBottom();
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 }

聽 聽DEFINE DIALOG oDlg TITLE "DBF builder" SIZE 415, 400

聽 聽@ 0.5, 聽2 SAY "Field Name" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 10 SAY "Type" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 17 SAY "Len" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 22 SAY "Dec" OF oDlg SIZE 20, 8

聽 聽@ 1.4, 1 GET oGet VAR cFieldName PICTURE "!!!!!!!!!!" OF oDlg SIZE 41, 11 UPDATE

聽 聽@ 1.3, 6.5 COMBOBOX cType ITEMS aType ;
聽 聽 聽 OF oDlg ON CHANGE Eval (bChange) UPDATE

聽 聽@ 1.4, 11.9 GET oLen VAR nLen PICTURE "999" OF oDlg SIZE 25, 11 UPDATE

聽 聽@ 1.4, 15.4 GET oDec VAR nDec PICTURE "999" OF oDlg SIZE 25, 11 UPDATE

聽 聽@ 0.9, 26 BUTTON "&Add" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION AddField( @aFields, @cFieldName, @cType, @nLen, @nDec, oGet, oBrw )

聽 聽@ 2.4, 26 BUTTON oBtn PROMPT "&Edit" OF oDlg SIZE 45, 13 ;
聽 聽 聽ACTION Eval (bSave)

聽 聽@ 3.4, 26 BUTTON "&Delete" OF oDlg SIZE 45, 13 ;
聽 聽 聽ACTION DelField (@aFields, @cFieldName, oGet, oBrw)

聽 聽@ 4.4, 26 BUTTON "Move &Up" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION If( oBrw:nArrayAt > 1,;
聽 聽 聽 聽 聽 聽 聽 聽 聽( aTemp := aFields[ oBrw:nArrayAt ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt ] := aFields[ oBrw:nArrayAt - 1 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt - 1 ] := aTemp,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:GoUp() ),)

聽 聽@ 5.4, 26 BUTTON "Move D&own" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION If( oBrw:nArrayAt < Len( aFields ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽( aTemp := aFields[ oBrw:nArrayAt ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt ] := aFields[ oBrw:nArrayAt + 1 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt + 1 ] := aTemp,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:GoDown() ),)

聽 聽@ 6.4, 26 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End()

聽 聽@ 2.2, 2 SAY "Fields" OF oDlg SIZE 40, 8

聽 聽@ 3.2, 1 XBROWSE oBrw ARRAY aFields AUTOCOLS ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 90, 55, 40, 40 ;
聽 聽 聽 SIZE 140, 130 OF oDlg ;
聽 聽 聽 ON DBLCLICK Eval (bEdit)

聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } }
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()

聽 聽@ 12.1, 2 SAY "DBF Name:" OF oDlg SIZE 30, 8

聽 聽@ 14, 6 GET cDbfName PICTURE "!!!!!!!!!!!!" OF oDlg SIZE 100, 11

聽 聽@ 10, 26 BUTTON "&Create" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( If( ! Empty( cDbfName ) .and. Len( aFields ) > 0,;
聽 聽 聽 聽 聽 DbCreate( AllTrim( cDbfName ), aFields ),), oDlg:End(),;
聽 聽 聽 聽 聽 Open( hb_CurDrive() + ":\" + CurDir() + "\" + AllTrim( cDbfName ) ) )

聽 聽ACTIVATE DIALOG oDlg CENTERED ON INIT (Eval (bChange), oBtn:Disable() ) ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽VALID !GETKEYSTATE( VK_ESCAPE )

return nil

//----------------------------------------------------------------------------//

function AddField( aFields, cFieldName, cType, nLen, nDec, oGet, oBrw )

聽 聽if Empty( cFieldName )
聽 聽 聽 oGet:SetPos( 0 )
聽 聽 聽 return nil
聽 聽endif

聽 聽if Len( aFields ) == 1 .and. Empty( aFields[ 1 ][ 1 ] )
聽 聽 聽 aFields = { { cFieldName, Upper( Left( cType, 1 ) ), nLen, nDec } }
聽 聽else
聽 聽 聽 AAdd( aFields, { cFieldName, Upper( Left( cType, 1 ) ), nLen, nDec } )
聽 聽endif

聽 聽oBrw:SetArray( aFields )
聽 聽oGet:VarPut( cFieldName := Space( 10 ) )
聽 聽oGet:SetPos( 0 )
聽 聽oGet:SetFocus()
聽 聽oBrw:GoBottom()

return nil
聽 聽 聽 聽 
//----------------------------------------------------------------------------//

function Paste()

聽 聽if oWndMain:oWndActive != nil
聽 聽 聽 oWndMain:oWndActive:Paste()
聽 聽endif 聽 

return nil

//----------------------------------------------------------------------------//
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: FiveDBU para 32/64 bits
Posted: Wed Jun 06, 2012 01:53 PM
regards, saludos

Antonio Linares
www.fivetechsoft.com