* Program..: Export.prg * Author...: Jeremy Suiter * Date.....: 14/04/2003 * * Notice...: Copyright (c) 2003, Jeremy Suiter, All Rights Reserved * Notes....: Visual DbEditor export functions #Include "Gra.ch" #Include "Xbp.ch" #Include "Appevent.ch" #Include "DbEditor.ch" #Include "Dll.ch" #Include "Font.ch" #Include "FoxDbe.ch" #Include "CdxDbe.ch" #Include "Dmlb.ch" #Include "Dbstruct.ch" #Include "Resources.ch" Static oFieldList, oFieldsSelected, oFor, oWhile, oCount, oRest, oDBE, oProgress, oExportAll *************** Func ExportData() *************** * export data to a file Local nEvent:=Nil, mp1:=Nil, mp2:=Nil, aPos:={}, aDbe, x, oFocus:=SetAppFocus(), lExportAll:=.F., aIniFile:={} Local oDlg:=Nil, oXbp:=Nil, drawingArea:=Nil, oGroup1:=Nil, oGroup2:=Nil, oGroup3:=Nil Begin Sequence If !YesNo("Copy records to a new file","Copy") SetAppFocus(oFocus) Break EndIf // read export all settings aIniFile:=IniLoad(IniFileLoc()) lExportAll:=Iif(Upper(IniGet(aIniFile, "DEFAULTS", "EXPORT_ALL"))="TRUE",.T.,.F.) aPos:=CenterPos({523,508},AppDesktop():currentSize()) oDlg:=XbpDialog():new(AppDesktop(), SetAppWindow(), aPos, {523,508}, , .F.) oDlg:icon:=ICON_MAIN oDlg:taskList:=.F. oDlg:border:=XBPDLG_RAISEDBORDERTHIN_FIXED oDlg:title:="Export Data" oDlg:close:={|mp1,mp2,obj| PostAppEvent(xbeP_Close+1000) } oDlg:create() oDlg:setModalState(XBP_DISP_APPMODAL) drawingArea:=oDlg:drawingArea drawingArea:setFontCompoundName("8.Helv") // fields to export oGroup1:=XbpStatic():new(drawingArea, , {12,228}, {492,240}) oGroup1:caption:="Select Fields" oGroup1:clipSiblings:=.T. oGroup1:type:=XBPSTATIC_TYPE_GROUPBOX oGroup1:create() oFieldList:=XbpListBox():new(oGroup1, , {12,12}, {204,204}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } }) oFieldList:tabStop:=.T. oFieldList:markMode:=XBPLISTBOX_MM_SINGLE oFieldList:itemSelected:={|| SelectField() } oFieldList:setInputFocus:={| uNil1,uNil2,self | XbpBorder(self,GRA_CLR_BLUE) } oFieldList:killInputFocus:={| uNil1,uNil2,self | XbpBorder(self, GRA_CLR_BACKGROUND) } oFieldList:create() AddFields(oFieldList,.T.) oFieldList:setData({1},.T.) oFieldsSelected:=XbpListBox():new(oGroup1, , {276,12}, {204,204}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } }) oFieldsSelected:tabStop:=.T. oFieldsSelected:markMode:=XBPLISTBOX_MM_SINGLE oFieldsSelected:itemSelected:={|| UnSelectField() } oFieldsSelected:setInputFocus:={| uNil1,uNil2,self | XbpBorder(self,GRA_CLR_BLUE) } oFieldsSelected:killInputFocus:={| uNil1,uNil2,self | XbpBorder(self, GRA_CLR_BACKGROUND) } oFieldsSelected:create() oXbp:=XbpPushButton():new(oGroup1, , {228,160}, {36,24}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 }, { XBP_PP_COMPOUNDNAME, "12.Arial" } }) oXbp:caption:=">" oXbp:tabStop:=.T. oXbp:create() oXbp:activate:={|| SelectField() } oXbp:=XbpPushButton():new(oGroup1, , {228,124}, {36,24}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 }, { XBP_PP_COMPOUNDNAME, "12.Arial" } }) oXbp:caption:=">>" oXbp:tabStop:=.T. oXbp:create() oXbp:activate:={|| oFieldList:clear(), oFieldsSelected:clear(), AddFields(oFieldsSelected,.T.), oFieldsSelected:setData({1},.T.) } oXbp:=XbpPushButton():new(oGroup1, , {228,88}, {36,24}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 }, { XBP_PP_COMPOUNDNAME, "12.Arial" } }) oXbp:caption:="<" oXbp:tabStop:=.T. oXbp:create() oXbp:activate:={|| UnSelectField() } oXbp:=XbpPushButton():new(oGroup1, , {228,50}, {36,24}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 }, { XBP_PP_COMPOUNDNAME, "12.Arial" } }) oXbp:caption:="<<" oXbp:tabStop:=.T. oXbp:create() oXbp:activate:={|| oFieldsSelected:clear(), AddFields(oFieldList,.T.), oFieldList:setData({1},.T.) } // export options oGroup2:=XbpStatic():new(drawingArea, , {132,48}, {372,168}) oGroup2:caption:="Options" oGroup2:clipSiblings:=.T. oGroup2:type:=XBPSTATIC_TYPE_GROUPBOX oGroup2:create() oXbp:=XbpStatic():new(oGroup2, , {12,120}, {44,24}) oXbp:caption:=GEN_FOR oXbp:clipSiblings:=.T. oXbp:options:=XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT oXbp:create() oFor:=XbpSLE():new(oGroup2, , {68,120}, {292,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } }) oFor:tabStop:=.T. oFor:setInputFocus:={| uNil1,uNil2,self | XbpBorder(self,GRA_CLR_BLUE) } oFor:killInputFocus:={| uNil1,uNil2,self | XbpBorder(self, GRA_CLR_BACKGROUND) } oFor:create() oXbp:=XbpStatic():new(oGroup2, , {12,84}, {44,24}) oXbp:caption:=GEN_WHILE oXbp:clipSiblings:=.T. oXbp:options:=XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT oXbp:create() oWhile:=XbpSLE():new(oGroup2, , {68,84}, {292,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } }) oWhile:tabStop:=.T. oWhile:setInputFocus:={| uNil1,uNil2,self | XbpBorder(self,GRA_CLR_BLUE) } oWhile:killInputFocus:={| uNil1,uNil2,self | XbpBorder(self, GRA_CLR_BACKGROUND) } oWhile:create() oXbp:=XbpStatic():new(oGroup2, , {12,48}, {44,24}) oXbp:caption:="Count" oXbp:clipSiblings:=.T. oXbp:options:=XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT oXbp:create() oCount:=XbpSpinbutton():new(oGroup2, , {68,48}, {60,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } }) oCount:tabStop:=.T. oCount:setInputFocus:={| uNil1,uNil2,self | XbpBorder(self,GRA_CLR_BLUE) } oCount:killInputFocus:={| uNil1,uNil2,self | XbpBorder(self, GRA_CLR_BACKGROUND) } oCount:create() oCount:setNumLimits(0,LastRec()-RecNo()) oRest:=XbpCheckbox():new(oGroup2, , {168,48}, {96,24}) oRest:caption:=GEN_REST oRest:tabStop:=.T. oRest:setInputFocus:={| uNil1,uNil2,self | XbpBorder(self,GRA_CLR_BLUE) } oRest:killInputFocus:={| uNil1,uNil2,self | XbpBorder(self, GRA_CLR_BACKGROUND) } oRest:create() oExportAll:=XbpCheckbox():new(oGroup2, , {248,48}, {96,24}) oExportAll:caption:="Export ALL" oExportAll:tabStop:=.T. oExportAll:selection:=lExportAll oExportAll:setInputFocus:={| uNil1,uNil2,self | XbpBorder(self,GRA_CLR_BLUE) } oExportAll:killInputFocus:={| uNil1,uNil2,self | XbpBorder(self, GRA_CLR_BACKGROUND) } oExportAll:create() // recessed static for export progress bar oXbp:=XbpStatic():new(oGroup2, , {12,12}, {350,20}) oXbp:type:=XBPSTATIC_TYPE_RECESSEDBOX oXbp:create() oProgress:=ProgressBar():new(oGroup2, , {12,12}, {350,20},,.F.) oProgress:create() oProgress:hide() // DBE selection oGroup3:=XbpStatic():new(drawingArea, , {12,48}, {108,168}) oGroup3:caption:="Select DBE" oGroup3:clipSiblings:=.T. oGroup3:type:=XBPSTATIC_TYPE_GROUPBOX oGroup3:create() oDbe:=XbpCombobox():new(oGroup3, , {12,12}, {84,132}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD }, { XBP_PP_DISABLED_BGCLR, GRA_CLR_WHITE }}) oDbe:tabstop:=.T. oDbe:type:=XBPCOMBO_DROPDOWN oDbe:XbpSLE:editable:=.F. oDbe:setInputFocus:={| uNil1,uNil2,self | XbpBorder(self,GRA_CLR_BLUE) } oDbe:killInputFocus:={| uNil1,uNil2,self | XbpBorder(self, GRA_CLR_BACKGROUND) } oDbe:create() oDbe:XbpSLE:setData(cDbe) aDbe:=DbeList() ASort(aDbe,,, {|aX,aY| aX[1] < aY[1] }) For x:=1 To Len(aDbe) If aDbe[x,2]==.F. oDbe:addItem(aDbe[x,1]) EndIf Next // pushbuttons oXbp:=XbpPushButton():new(drawingArea, , {300,12}, {96,24}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } }) oXbp:caption:="Export" oXbp:tabStop:=.T. oXbp:create() oXbp:activate:={|| DataExport() } oXbp:=XbpPushButton():new(drawingArea, , {408,12}, {96,24}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } }) oXbp:caption:=GEN_CLOSE oXbp:tabStop:=.T. oXbp:create() oXbp:activate:={|| PostAppEvent(xbeP_Close+1000) } oDlg:show() SetAppFocus(oFieldList) nEvent:=xbe_None Do While nEvent<>xbeP_Close+1000 nEvent:=AppEvent(@mp1, @mp2, @oXbp) oXbp:handleEvent(nEvent, mp1, mp2) if nEvent == xbeP_Keyboard .and.; mp1 == xbeK_ESC exit endif EndDo oDlg:destroy() SetAppFocus(oFocusBrowse) End Return Nil *********************** Static Func SelectField() *********************** Local nItem Begin Sequence If Len(oFieldList:getData())<=0 Break EndIf nItem:=oFieldList:getData()[1] If nItem<=0 Break EndIf oFieldsSelected:addItem(oFieldList:getItem(nItem)) oFieldList:delItem(nItem) If nItem>oFieldList:numItems() nItem:=oFieldList:numItems() EndIf oFieldList:setData({nItem},.T.) End Return Nil ************************* Static Func UnSelectField() ************************* Local nItem Begin Sequence If Len(oFieldsSelected:getData())<=0 Break EndIf nItem:=oFieldsSelected:getData()[1] If nItem<=0 Break EndIf oFieldList:addItem(oFieldsSelected:getItem(nItem)) oFieldsSelected:delItem(nItem) If nItem>oFieldsSelected:numItems() nItem:=oFieldsSelected:numItems() EndIf oFieldsSelected:setData({nItem},.T.) End Return Nil *************** Func DataExport() *************** * export data to file Local cFile:="", cFor:="", cWhile:="", oDlg, oFocus:=SetAppFocus(), aFieldNames:={}, x, cTemp, bTemp, bFor, bWhile, nRecNo:=RecNo() Begin Sequence cFor:=oFor:getData() cWhile:=oWhile:getData() If oFieldsSelected:numItems()<=0 .Or. (!Empty(cFor) .And. !TestCondition(cFor)) .Or. (!Empty(cWhile) .And. !TestCondition(cWhile)) Break EndIf If !YesNo("Export data for selected fields") SetAppFocus(oFocus) Break EndIf // get filename oDlg:=XbpFileDialog():new() oDlg:fileFilters:={{"All Files",".*"}} oDlg:center:=.T. oDlg:create() Do While .T. cFile:=oDlg:saveAs(cDirectory+"*.*") If File(cFile) .And. !YesNo("File already exists, overwrite","Overwrite") Loop Else Exit EndIf EndDo oDlg:destroy() SetAppFocus(oFocus) If Empty(cFile) Break EndIf // create list of fields For x:=1 To oFieldsSelected:numItems() cTemp:=oFieldsSelected:getItem(x) cTemp:=Left(cTemp,At("[",cTemp)-1) Aadd(aFieldNames,cTemp) Next // go top if export all is checked If oExportAll:getData() DbGoTop() EndIf // export data oProgress:minimum:=1 oProgress:maximum:=LastRec() oProgress:current:=1 oProgress:show() If Empty(cFor) cFor:=".T." EndIf bTemp:=&("{|| "+cFor+" }") bFor:={|| oProgress:increment(), Eval(bTemp) } If Empty(cWhile) cWhile:=".T." EndIf bWhile:=&("{|| "+cWhile+" }") DbSuspendNotifications() XoExport(cFile, aFieldNames, bFor, bWhile, IIF(oCount:getData()>0, oCount:getData(), Nil), , oRest:getData(), oDbe:XbpSle:getData()) DbGoto(nRecNo) DbResumeNotifications() oProgress:hide() Errm(ERR_ERRM25,ERR_ERRM26) End Return Nil