* Program..: Import.prg * Author...: Jeremy Suiter * Date.....: 17/04/2003 * * Notice...: Copyright (c) 2003, Jeremy Suiter, All Rights Reserved * Notes....: Visual DbEditor Import 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, oProgress, cDefDbe, nRecords, cImportFile *************** Func ImportData() *************** * Import data to a file Local nEvent:=Nil, mp1:=Nil, mp2:=Nil, aPos:={}, aDbe, x:=Nil, y, oFocus:=SetAppFocus() Local oDlg:=Nil, oXbp:=Nil, drawingArea:=Nil, oGroup1:=Nil, oGroup2:=Nil, aFields:={}, cDesc:="" Local oDbeDlg:=Nil, aSize:=Nil, oDbe Begin Sequence If !YesNo("Append records to this table","Append") SetAppFocus(oFocus) Break EndIf cDefDbe:=cDbe cImportFile:=ReadFile(.F.) If Empty(cImportFile) SetAppFocus(oFocus) Break EndIf aSize:={Max(300,StringLength(cImportFile, AppDesktop():lockPS())),203} AppDesktop():unlockPS() aPos:=CenterPos(aSize,AppDesktop():currentSize()) oDbeDlg:=XbpDialog():new(AppDesktop(), oDlg, aPos, aSize, DEFAULT_PRESPARAM, .F.) oDbeDlg:icon:=ICON_MAIN oDbeDlg:taskList:=.F. oDbeDlg:border:=XBPDLG_RAISEDBORDERTHIN_FIXED oDbeDlg:title:=cImportFile oDbeDlg:close:={|mp1,mp2,obj| PostAppEvent(xbeP_Close+1000) } oDbeDlg:create() oDbeDlg:setModalState(XBP_DISP_APPMODAL) drawingArea:=oDbeDlg:drawingArea drawingArea:setFont(oDbeDlg:setFont()) oGroup1:=XbpStatic():new(drawingArea, , {12,48}, {132,128}) oGroup1:caption:="Select DBE" oGroup1:clipSiblings:=.T. oGroup1:type:=XBPSTATIC_TYPE_GROUPBOX oGroup1:create() oDbe:=XbpCombobox():new(oGroup1, , {12,12}, {108,96}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD }, { XBP_PP_DISABLED_BGCLR, GRA_CLR_WHITE }}) oDbe:tabstop:=.T. oDbe:type:=XBPCOMBO_DROPDOWN oDbe:XbpSLE:editable:=.F. oDbe:create() oDbe:XbpSLE:setData(cDefDbe) aDbe:=DbeList() ASort(aDbe,,, {|aX,aY| aX[1] < aY[1] }) For y:=1 To Len(aDbe) If aDbe[y,2]==.F. oDbe:addItem(aDbe[y,1]) EndIf Next oDbe:ItemSelected:={|mp1, mp2, obj| cDefDbe:=obj:XbpSLE:getData() } oXbp:=XbpPushButton():new(drawingArea, , {12,12}, {60,24}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } }) oXbp:caption:=GEN_OPEN oXbp:tabStop:=.T. oXbp:create() oXbp:activate:={|| PostAppEvent(xbeP_Close+1000) } oXbp:=XbpPushButton():new(drawingArea, , {84,12}, {60,24}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } }) oXbp:caption:=GEN_CANCEL oXbp:tabStop:=.T. oXbp:create() oXbp:activate:={|| cImportFile:="", PostAppEvent(xbeP_Close+1000) } oDbeDlg:show() SetAppFocus(oDbeDlg) 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 oDbeDlg:destroy() If !Empty(cImportFile) If !NetUse(cImportFile,,"ZZZZZZZZ",,cDefDbe) SetAppFocus(oFocus) Break EndIf For x:=1 To FCount() cDesc:=" ["+DbStruct()[x,DBS_TYPE]+","+Ntrim(DbStruct()[x,DBS_LEN])+","+Ntrim(DbStruct()[x,DBS_DEC])+"]" Aadd(aFields,FieldName(x)+cDesc) Next nRecords:=LastRec() DbCloseArea() Else SetAppFocus(oFocus) Break EndIf aPos:=CenterPos({523,508},AppDesktop():currentSize()) oDlg:=XbpDialog():new(AppDesktop(), MainWindow(), aPos, {523,508}, DEFAULT_PRESPARAM, .F.) oDlg:icon:=ICON_MAIN oDlg:taskList:=.F. oDlg:border:=XBPDLG_RAISEDBORDERTHIN_FIXED oDlg:title:="Import Data From "+cImportFile oDlg:close:={|mp1,mp2,obj| PostAppEvent(xbeP_Close+1000) } oDlg:create() oDlg:setModalState(XBP_DISP_APPMODAL) drawingArea:=oDlg:drawingArea drawingArea:setFont(oDlg:setFont()) // fields to Import 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:create() AddFields(oFieldList,aFields) 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: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,aFields), 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,aFields), oFieldList:setData({1},.T.) } // Import options oGroup2:=XbpStatic():new(drawingArea, , {12,48}, {492,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}, {412,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } }) oFor:tabStop:=.T. 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}, {412,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } }) oWhile:tabStop:=.T. 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:create() oCount:setNumLimits(0,LastRec()-RecNo()) oRest:=XbpCheckbox():new(oGroup2, , {168,48}, {96,24}) oRest:caption:=GEN_REST oRest:tabStop:=.T. oRest:create() // recessed static for Import progress bar oXbp:=XbpStatic():new(oGroup2, , {12,12}, {470,20}) oXbp:type:=XBPSTATIC_TYPE_RECESSEDBOX oXbp:create() oProgress:=ProgressBar():new(oGroup2, , {12,12}, {470,20},,.F.) oProgress:create() oProgress:hide() // pushbuttons oXbp:=XbpPushButton():new(drawingArea, , {300,12}, {96,24}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } }) oXbp:caption:="Import" oXbp:tabStop:=.T. oXbp:create() oXbp:activate:={|| DataImport() } 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 AddFields(oList, aFields) ********************* * add fields to list Local x Begin Sequence For x:=1 To Len(aFields) oList:addItem(aFields[x]) Next 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 DataImport() *************** Local cFor:="", cWhile:="", oFocus:=SetAppFocus(), aFieldNames:={}, x, cTemp, bTemp, bFor, bWhile, nRecNo:=RecNo() Local oError, bSaveErrorBlock:=ErrorBlock({|oError| Break(oError)}) 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("Import data for selected fields") SetAppFocus(oFocus) 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 // import data oProgress:minimum:=1 oProgress:maximum:=nRecords 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() DbImport(cImportFile, aFieldNames, bFor, bWhile, IIF(oCount:getData()>0, oCount:getData(), Nil), , oRest:getData(), cDefDbe) DbGoto(nRecNo) DbResumeNotifications() oProgress:hide() Errm(ERR_ERRM27,ERR_ERRM28) Recover Using oError Errm(ERR_ERRM29) End // Restore prior error block ErrorBlock(bSaveErrorBlock) Return Nil