home *** CD-ROM | disk | FTP | other *** search
/ Total C++ 2 / TOTALCTWO.iso / vfp5.0 / vfp / tools / convert / foreign.prg < prev    next >
Text File  |  1996-08-21  |  32KB  |  1,103 lines

  1. *- Foreign.PRG
  2. *-
  3. *- FoxPro 3.0 Converter Utility - Foreign File Conversion Parts
  4. *-
  5. *- (c) Microsoft Corporation 1995
  6. *-
  7.  
  8.  
  9. #INCLUDE "convert.h"
  10. #INCLUDE "foreign.h"
  11.  
  12. EXTERNAL ARRAY gAShowMe
  13.  
  14. **********************************************
  15. DEFINE CLASS ForeignConverterBase AS ConverterBase
  16. **********************************************
  17.     *- This is a parent class for all classes 
  18.     *- that migrate files fron non-FoxPro platforms
  19.     *- including FoxBASE+ and DBase
  20.  
  21.     *----------------------------------
  22.     PROCEDURE Create25SCX
  23.     *----------------------------------
  24.         *- create a 2.5 type screen file, which
  25.         *- can be converted later to a 3.0 scx file
  26.  
  27.         PARAMETER cNew25File
  28.  
  29.         SELECT(SELECT(1))
  30.         CREATE DBF (m.cNew25File)   ;
  31.             ( platform   c(8),    ;
  32.               uniqueid   c(10),   ;
  33.               timestamp  n(10),   ;
  34.               objtype    n(2),    ;
  35.               objcode    n(3),    ;
  36.               name       m,       ;
  37.               expr       m,       ;
  38.               vpos       n(7,3),  ;
  39.               hpos       n(7,3),  ;
  40.               height     n(7,3),  ;
  41.               width      n(7,3),  ;
  42.               style      n(2),    ;
  43.               picture    m,       ;
  44.               order      m,       ;
  45.               "unique"    l,       ;
  46.               comment    m,       ;
  47.               environ    l,       ;
  48.               boxchar    c( 1),   ;
  49.               fillchar   c( 1),   ;
  50.               tag        m(10),   ;
  51.               tag2       m(10),   ;
  52.               penred     n(5),    ;
  53.               pengreen   n(5),    ;
  54.               penblue    n(5),    ;
  55.               fillred    n(5),    ;
  56.               fillgreen  n(5),    ;
  57.               fillblue   n(5),    ;
  58.               pensize    n(5),    ;
  59.               penpat     n(5),    ;
  60.               fillpat    n(5),    ;
  61.               fontface   m,       ;
  62.               fontstyle  n(3),    ;
  63.               fontsize   n(3),    ;
  64.               mode       n(3),    ;
  65.               ruler      n(1),    ;
  66.               rulerlines n(1),    ;
  67.               grid       l,       ;
  68.               gridv      n(2),    ;
  69.               gridh      n(2),    ;
  70.               scheme     n(2),    ;
  71.               scheme2    n(2),    ;
  72.               colorpair  c(8),    ;
  73.               lotype     n(1),    ;
  74.               rangelo    m,       ;
  75.               hitype     n(1),    ;
  76.               rangehi    m,       ;
  77.               whentype   n(1),    ;
  78.               when       m,       ;
  79.               validtype  n(1),    ;
  80.               valid      m,       ;
  81.               errortype  n(1),    ;
  82.               error      m,       ;
  83.               messtype   n(1),    ;
  84.               message    m,       ;
  85.               showtype   n(1),    ;
  86.               show       m,       ;
  87.               activtype  n(1),    ;
  88.               activate   m,       ;
  89.               deacttype  n(1),    ;
  90.               deactivate m,       ;
  91.               proctype   n(1),    ;
  92.               proccode   m,       ;
  93.               setuptype  n(1),    ;
  94.               setupcode  m,       ;
  95.               float      l,       ;
  96.               close      l,       ;
  97.               minimize   l,       ;
  98.               border     n(1),    ;
  99.               shadow     l,       ;
  100.               center     l,       ;
  101.               refresh    l,       ;
  102.               disabled   l,       ;
  103.               scrollbar  l,       ;
  104.               addalias   l,       ;
  105.               tab        l,       ;
  106.               initialval m,       ;
  107.               initialnum n(3),    ;
  108.               spacing    n(6,3),  ;
  109.               curpos     l        ;
  110.             )
  111.  
  112.         IF USED("newfile")
  113.             USE IN newfile
  114.         ENDIF
  115.         USE (m.cNew25File) ALIAS newfile EXCLUSIVE
  116.         RETURN
  117.     ENDPROC
  118.  
  119.  
  120. ENDDEFINE
  121.  
  122.  
  123. **********************************************
  124. DEFINE CLASS DB4CatConverter AS FPCConverter
  125. **********************************************
  126.  
  127.     fmtConverterClass = "FmtConverter"
  128.     cErrStr = ""
  129.  
  130.     *------------------------------------
  131.     PROCEDURE Init
  132.     *------------------------------------
  133.         *- only if called from Project
  134.         PARAMETER aParms
  135.  
  136.         *- THIS.aParms[2] = m.pFiletype
  137.         *- THIS.aParms[3] = m.pVersion
  138.         *- THIS.aParms[4] = m.pFilename
  139.  
  140.         LOCAL m.nct2, m.nct3
  141.  
  142.         gOPJX = THIS
  143.  
  144.         SET ESCAPE ON
  145.         ON ESCAPE DO EscHandler
  146.  
  147.         THIS.isproj = .F.        && not really a project
  148.  
  149.         THIS.nTimeStamp = THIS.TStamp()
  150.         THIS.pjxName = aParms[4]
  151.         THIS.pjxVersion = aParms[3]
  152.         THIS.cBackDir = aParms[1]
  153.  
  154.         THIS.lDevMode = aParms[7]
  155.         THIS.cCodeFile = aParms[8]
  156.         THIS.lLog = aParms[9]
  157.         THIS.cLogFile = aParms[10]
  158.         THIS.cCurrentFile = THIS.pjxName
  159.  
  160.         THIS.WriteLog(C_CONVLOG_LOC + THIS.pjxName,"")
  161.         THIS.WriteLog(C_CONVVERS_LOC + C_CONVERSION_LOC,"")
  162.         THIS.WriteLog("","")
  163.  
  164.         THIS.pjx25Alias = THIS.OpenFile(THIS.pjxName)
  165.  
  166.         IF EMPTY(THIS.pjx25Alias)
  167.             =MESSAGEBOX(E_NOOPEN_LOC + THIS.pjxName + ".")
  168.             THIS.lHadError = .T.
  169.             RETURN
  170.         ENDIF
  171.  
  172.         *- don;t show dialog for files when they get transported
  173.         FOR i = 1 TO N_MAXTRANFILETYPES
  174.             gAShowMe[i,1] = .F.        && show the dialog?
  175.             gAShowMe[i,2] = 1        && choice
  176.             gAShowMe[i,3] = ""        && font name
  177.             gAShowMe[i,4] = 0        && font size
  178.             gAShowMe[i,5] = ""        && font style
  179.             gAShowMe[i,6] = ""        && from platform
  180.         NEXT
  181.  
  182.         *- Add records from old PJX file
  183.         SELECT (THIS.pjx25Alias)
  184.         COUNT FOR !DELETED() AND type = "scr" TO m.nct2
  185.         COUNT FOR !DELETED() TO m.nct3
  186.         THIS.nScreenSets = m.nct2 + m.nct3
  187.         THIS.curscxid = 0
  188.  
  189.         gOTherm.Update2(0,C_CAT2FPC_LOC)
  190.         
  191.         gOTherm.visible = .T.
  192.  
  193.         IF !THIS.CATConv()
  194.             *- error message displayed in CATConv()
  195.             THIS.lHadError = .T.
  196.             RETURN
  197.         ENDIF
  198.  
  199.         gOTherm.Update2(.03,c_BACKFILES_LOC)
  200.  
  201.         THIS.cBackDir = ADDBS(THIS.cBackDir)
  202.         THIS.cHomeDir = ADDBS(JustPath(THIS.pjxName))
  203.  
  204.         IF gOMaster.lHadError
  205.             THIS.CloseFiles
  206.             THIS.lHadError = .T.
  207.             RETURN .F.
  208.         ENDIF
  209.  
  210.         gOTherm.Update2((1 - N_THERM2X) * 100,C_PROJTASK3_LOC)        && update therm with next task
  211.  
  212.     ENDPROC        &&    DB4CatConverter:Init
  213.  
  214.     *------------------------------------
  215.     PROCEDURE Error
  216.     *------------------------------------
  217.         PARAMETER ErrorNum, Method, Line
  218.         THIS.lHadError = .T.
  219.         *- check if minor error, which we can recover from
  220.         IF THIS.lLocalErr
  221.             THIS.cErrStr = ALLTRIM(STR(ERROR()))+' ('+MESSAGE()+')'
  222.             RETURN
  223.         ENDIF
  224.  
  225.         *- call the ancestor;s error handler
  226.         Cvt::Error(ErrorNum, Method, Line)
  227.  
  228.     ENDPROC        &&  Error
  229.  
  230.     *------------------------------------
  231.     FUNCTION Converter            && DB4CatConverter
  232.     *------------------------------------
  233.         *- convert objects within the .CAT file first, to 2.6 version
  234.         *- convert FPC itself
  235.         *- convert each of the objects in it to 3.0
  236.  
  237.         PRIVATE cOld, cTmpFile
  238.  
  239.         cOld = THIS.pjx25Alias
  240.  
  241.         *- convert objects within the .CAT file first, to 2.6 version
  242.         THIS.ConvertDB2FP()
  243.         IF THIS.lHadError
  244.             THIS.CloseFiles
  245.             RETURN
  246.         ENDIF
  247.  
  248.         IF USED(THIS.pjx25Alias)
  249.             USE IN (THIS.pjx25Alias)
  250.         ENDIF
  251.         THIS.pjx25alias = THIS.new30alias
  252.  
  253.         *- call superclass converter
  254.         RETURN FPCConverter::Converter()
  255.  
  256.     ENDPROC
  257.  
  258.     *------------------
  259.     PROCEDURE ClosePJX        && DB4CatConverter
  260.     *------------------
  261.  
  262.         FPCConverter::ClosePJX
  263.  
  264.         *- erase the intermediate 2.6 catalog files
  265.         IF FILE(FORCEEXT(THIS.cFull30PJXName,".FPC"))
  266.             ERASE (FORCEEXT(THIS.cFull30PJXName,".FPC"))
  267.         ENDIF
  268.         IF FILE(FORCEEXT(THIS.cFull30PJXName,".FCT"))
  269.             ERASE (FORCEEXT(THIS.cFull30PJXName,".FCT"))
  270.         ENDIF
  271.  
  272.     ENDPROC        && DB4CatConverter:ClosePJX
  273.  
  274.     *------------------------------------
  275.     FUNCTION CatConv
  276.     *------------------------------------
  277.         *- Converts a dBASE catalog file to FoxPro 2.6 Catalog. 
  278.  
  279.         PRIVATE m.wziselect, m.wzsdirname, m.wzs, ;
  280.             m.wzlreturn, ;
  281.             m.wzsnewname, m.wzlautoname, m.wzstmpname, m.wzsDefault
  282.  
  283.         LOCAL m.ctmppath, m.cnewpath, cTmpFnameOld, cTmpFname
  284.  
  285.         m.wzsDefault = SET('default') + CURDIR()
  286.         THIS.lLocalErr = .T.
  287.  
  288.         *- get catalog name, fix code page
  289.         m.wzstmpname=''
  290.         IF !EMPTY(CPCURRENT()) .AND. EMPTY(CPDBF())
  291.             m.wzstmpname=AddBS(SYS(2023))+SYS(3)+'.CAT'
  292.             DO WHILE FILE(m.wzstmpname)
  293.                 m.wzstmpname = AddBS(SYS(2023))+SYS(3)+'.CAT'
  294.             ENDDO
  295.             USE IN (THIS.pjx25Alias)
  296.             COPY FILE (THIS.pjxName) TO (m.wzstmpname)
  297.             IF THIS.lHadError
  298.                 =MESSAGEBOX(STRTRAN(E_COPY_LOC,"@1",THIS.cErrStr) + ;
  299.                     m.wzstmpname + ".")
  300.                 THIS.lHadError = .F.
  301.                 THIS.lLocalErr = .F.
  302.                 RETURN .F.
  303.             ENDIF
  304.             IF !cptag(m.wzstmpname,CPCURRENT(2))
  305.                 ERASE (m.wzstmpname)
  306.                 RETURN .F.
  307.             ELSE
  308.                 USE (m.wzstmpname) ALIAS (THIS.pjx25Alias) IN 0
  309.                 IF THIS.lHadError
  310.                     =MESSAGEBOX(STRTRAN(E_OPEN_LOC,"@1",THIS.cErrStr) + ;
  311.                         m.wzstmpname + ".")
  312.                     ERASE (m.wzstmpname)
  313.                     THIS.lHadError = .F.
  314.                     THIS.lLocalErr = .F.
  315.                     RETURN .F.
  316.                 ENDIF
  317.             ENDIF
  318.         ENDIF
  319.         THIS.lLocalErr = .F.
  320.  
  321.         *- get name for converted 2.6 (FPC) catalog
  322.         m.wzlautoname=.F.
  323.         m.wzsnewname=ForceExt(SYS(2027,THIS.pjxName),'FPC')
  324.         IF FILE(m.wzsnewname) .OR. FILE(ForceExt(SYS(2027,m.wzsnewname),'FPT'))
  325.             m.wzsnewname=AutoName(m.wzsnewname,'FPC',.T.)
  326.             m.wzlautoname=.T.
  327.         ENDIF
  328.         
  329.         m.wzlreturn=.T.
  330.  
  331.         *- make new FPC catalog
  332.         IF EMPTY(THIS.FPCNew(m.wzsnewname,.T.,IIF(!EMPTY(CPCURRENT()),CPCURRENT(2),.F.)))
  333.             DO WHILE .T.
  334.                 m.wzlreturn=.T.
  335.                 m.wzsdirname = JustPath(THIS.pjxName)
  336.                 m.wzsnewname=m.wzsdirname+ForceExt(JustFName(THIS.pjxName),'FPC')
  337.                 IF FILE(m.wzsnewname) .OR. FILE(ForceExt(SYS(2027,m.wzsnewname),'FPT'))
  338.                     m.wzsnewname=autoname(m.wzsnewname,'FPC',.T.)
  339.                     m.wzlautoname=.T.
  340.                 ELSE
  341.                     m.wzlautoname=.F.
  342.                 ENDIF
  343.                 IF !EMPTY(THIS.FPCNew(m.wzsnewname,.T.,IIF(!EMPTY(CPCURRENT()),CPCURRENT(2),.F.)))
  344.                     EXIT
  345.                 ENDIF
  346.             ENDDO
  347.         ENDIF
  348.  
  349.         *- move data from DB4 CAT to new FPC catalog
  350.         IF m.wzlreturn
  351.             APPEND FIELDS path, file_name, alias, type, ;
  352.                 title, code, tag FROM (DBF(THIS.pjx25Alias)) FOR !DELETED()
  353.             m.ctmppath = JustPath(SYS(2027,THIS.pjxName))
  354.             SET DEFAULT TO (m.ctmppath)
  355.             REPLACE ALL path WITH FULLPATH(ALLTRIM(path)), ;
  356.                 file_name WITH ALLTRIM(file_name), ;
  357.                 title WITH ALLTRIM(title)
  358.             m.ctmppath = JustPath(SYS(2027,m.wzsnewname))
  359.             SET DEFAULT TO (m.ctmppath)
  360.             IF !(JustPath(THIS.pjxName) == JustPath(THIS.pjxName))
  361.                 DO updpaths WITH THIS.pjxName && IN fpcopen
  362.             ENDIF
  363.             *- make sure files are there, and if not, ask user to locate them
  364.             m.cnewpath = ""
  365.             SCAN FOR !FILE(TRIM(path))
  366.                 IF !EMPTY(m.cnewpath)
  367.                     *- check where the last place we found files
  368.                     IF FILE(m.cnewpath + JUSTFNAME(path))
  369.                         REPLACE path WITH m.cnewpath + JUSTFNAME(path)
  370.                         LOOP
  371.                     ENDIF
  372.                 ENDIF
  373.                 m.cTmpFnameOld = path
  374.                 m.cTmpFname = ""
  375.                 m.cTmpFname = GETFILE(JUSTEXT(m.cTmpFnameOld),C_LOCFILE_LOC + JUSTFNAME(m.cTmpFnameOld))
  376.  
  377.                 *- if found, update project
  378.                 IF !EMPTY(m.cTmpFname)
  379.                     REPLACE path WITH m.cTmpFname
  380.                     *- remember this location
  381.                     m.cnewpath = ADDBS(JUSTPATH(path))
  382.                 ENDIF
  383.             ENDSCAN
  384.  
  385.             THIS.pjxName = m.wzsnewname
  386.             IF m.wzlautoname
  387.                 *- let the user know an auto-name was used
  388.                 =MESSAGEBOX(E_NAMEPROB_LOC + THIS.pjxName + ".")
  389.             ENDIF
  390.         ENDIF
  391.         
  392.         IF !EMPTY(m.wzstmpname)
  393.             USE IN (THIS.pjx25Alias)
  394.             ERASE (m.wzstmpname)
  395.         ENDIF
  396.  
  397.         THIS.pjxName = m.wzsnewname
  398.  
  399.         SET DEFAULT TO (m.wzsDefault)
  400.  
  401.         RETURN m.wzlreturn
  402.         
  403.     ENDPROC
  404.  
  405.     *------------------------------------
  406.     FUNCTION ConvertDB2FP
  407.     *------------------------------------
  408.         *- Converts a each dBASE item to its 2.x equivalent
  409.         LOCAL m.wzsDefault, m.wzsMode, m.ctmppath, wzsfpcalias, wzsFName
  410.  
  411.         m.wzsDefault = SET('default')+CURDIR()
  412.  
  413.         SELECT (THIS.new30alias)
  414.         SCAN FOR !fox_file AND !DELETED()
  415.             *- only look at db4files
  416.  
  417.             m.wzsMode = IIF(type = C_DB4SCREENTYPE,"FORM",;
  418.                         IIF(type = C_DB4SQLQUERYTYPE OR type = C_DB4UPQUERYTYPE, "QUERY",;
  419.                         IIF(type = C_DB4REPORTTYPE, "REPORT",;
  420.                         IIF(type = C_DB4LABELTYPE,"LABEL","OTHER"))))
  421.  
  422.             DO CASE
  423.                 CASE INLIST(m.wzsMode,'FORM','REPORT','LABEL','QUERY')
  424.  
  425.                     m.ctmppath = JustPath(SYS(2027,ALLT(path)))
  426.                     m.wzsFName = path
  427.  
  428.                     IF !FILE(m.wzsfname)
  429.                         *- file isn;t there, and they had a chance earlier to locate it
  430.                         *- so log it, and continue
  431.                         *- if not there, log the error and continue
  432.                         THIS.WriteLog(JUSTFNAME(STRTRAN(m.wzsfname,C_NULL)),E_NOFILE_LOC + C_CONVERT3c_LOC + E_NOBACKUP_LOC)
  433.                         LOOP
  434.                     ENDIF
  435.  
  436.                     SET DEFAULT TO (m.ctmppath)
  437.                     IF !THIS.Migrate(@m.wzsFName, m.wzsMode)                && do migration
  438.                         LOOP
  439.                     ELSE
  440.                         wzsfpcalias = THIS.new30alias
  441.                         DO CASE
  442.                             CASE m.wzsmode = 'QUERY'
  443.                                 *- Migration of a .QBE could result in an auto-name, so
  444.                                 *- update the filename to be sure.
  445.                                 m.wziselect = SELECT()
  446.                                 SELECT (THIS.new30alias)
  447.                                 REPLACE path WITH UPPER(m.wzsfname)
  448.                                 SELECT (m.wziselect)
  449.                                 THIS.SetFoxFile(LOWER(justext(m.wzsfname)),.T.)
  450.                             CASE m.wzsmode = 'FORM'
  451.                                 THIS.SetFoxFile(C_FPCSCREENTYPE,.T.)
  452.                                 IF !_DOS
  453.                                     DO (gTransport) WITH (&wzsfpcalias..path), 12, .F., gAShowMe,m.gOTherm,(&wzsfpcalias..path)
  454.                                 ENDIF
  455.                             CASE m.wzsmode = 'REPORT'
  456.                                 THIS.SetFoxFile(C_FPCREPORTTYPE,.T.)
  457.                                 IF !_DOS
  458.                                     DO (gTransport) WITH (&wzsfpcalias..path), 13, .F., gAShowMe,m.gOTherm,(&wzsfpcalias..path)
  459.                                 ENDIF
  460.                             CASE m.wzsmode = 'LABEL'
  461.                                 THIS.SetFoxFile(C_FPCLABELTYPE,.T.)
  462.                                 IF !_DOS
  463.                                     DO (gTransport) WITH (&wzsfpcalias..path), 14, .F., gAShowMe,m.gOTherm,(&wzsfpcalias..path)
  464.                                 ENDIF
  465.                         ENDCASE
  466.  
  467.                     ENDIF
  468.  
  469.                     THIS.curscxid = THIS.curscxid + 1
  470.  
  471.                     IF THIS.nScreenSets > 0
  472.                         gOTherm.Update2((THIS.curscxid/(THIS.nScreenSets + 1) + (1 - N_THERM2X)) * 100)
  473.                     ENDIF
  474.  
  475.                 OTHERWISE
  476.             ENDCASE
  477.  
  478.         ENDSCAN
  479.  
  480.         SET DEFAULT TO (m.wzsDefault)
  481.  
  482.         RETURN .T.
  483.  
  484.     ENDPROC    && ConvertDB2FP
  485.  
  486.     *------------------------------------
  487.     FUNCTION fpcnew
  488.     *------------------------------------
  489.         *- Creates a new FoxPro catalog file with the name
  490.         *- m.wzsFName.
  491.         
  492.         PARAMETERS m.wzsfname, m.wzlleaveopen, m.wzicodepage
  493.         PRIVATE m.wzsprompt, m.wzs, m.wziselect
  494.  
  495.         m.wziselect=SELECT()
  496.         IF EMPTY(m.wzsfname)
  497.             *- make sure old file gets erased (jd 5/12/94)
  498.             m.wzsfname=putname('CATALOG','',.T.)
  499.             IF EMPTY(m.wzsfname)
  500.                 RETURN ''
  501.             ENDIF
  502.         ENDIF
  503.  
  504.         THIS.lLocalErr = .T.
  505.         
  506.         *- NOTE: CHANGES MADE HERE NEED TO BE REFLECTED IN FPCOPEN.PRG!!!
  507.         *- (FPCOpen() verifies the structure of the FPC being opened.)
  508.         *- Elsewhere in the code, specific elements in this array are
  509.         *- being referenced. Any change to the order of the fields
  510.         *- requires a sweep through the code to check for usage.
  511.         
  512.         CREATE TABLE (m.wzsfname) ;
  513.             (path        m, ;
  514.             file_name    m, ;
  515.             alias        C(10), ;
  516.             type        C(3), ;
  517.             title        m, ;
  518.             code        N(6,0), ;
  519.             tag            C(4), ;
  520.             fox_file    l, ;
  521.             indexes        m, ;
  522.             wizard        l)
  523.  
  524.         THIS.new30alias = ALIAS()
  525.  
  526.         THIS.lLocalErr = .F.
  527.         IF THIS.lHadError
  528.             THIS.lHadError = .F.
  529.             =MESSAGEBOX(STRTRAN(E_CREATE_LOC,"@1",THIS.cErrStr) + SYS(2027,m.wzsfname))
  530.             RETURN ''
  531.         ELSE
  532.             IF !EMPTY(m.wzicodepage)
  533.                 USE
  534.                 IF !cptag(m.wzsfname,m.wzicodepage)
  535.                     ERASE (m.wzsfname)
  536.                     RETURN ''
  537.                 ENDIF
  538.                 THIS.lLocalErr = .T.
  539.                 USE (m.wzsfname)
  540.                 THIS.lLocalErr = .F.
  541.                 IF THIS.lHadError
  542.                     =MESSAGEBOX(STRTRAN(E_OPEN_LOC,"@1",THIS.cErrStr) + SYS(2027,m.wzsfname))
  543.                     ERASE (m.wzsfname)
  544.                     THIS.lHadError = .F.
  545.                     RETURN ''
  546.                 ENDIF
  547.             ENDIF
  548.             *- change filetype if mac
  549.             IF _MAC
  550.                 PRIVATE wznerror
  551.                 wznerror = fxsettype(SYS(2027,m.wzsfname),'????','FOXX')
  552.                 IF m.wznerror <> 0
  553.                     *- error setting filetype
  554.                     =MESSAGEBOX(STRTRAN(E_OPEN_LOC,"@1",LTRIM(STR(m.wznerror))) + SYS(2027,m.wzsfname))
  555.                     ERASE (m.wzsfname)
  556.                     RETURN ''
  557.                 ENDIF
  558.                 RELEASE wznerror
  559.             ENDIF
  560.  
  561.             *- add the FPC record
  562.             THIS.addfpcrec
  563.             IF !m.wzlleaveopen
  564.                 USE
  565.                 SELECT (m.wziselect)
  566.             ENDIF
  567.         ENDIF
  568.         RETURN m.wzsfname
  569.  
  570.     ENDPROC
  571.  
  572.  
  573.     *------------------------------------
  574.     FUNCTION addfpcrec
  575.     *------------------------------------
  576.         APPEND BLANK
  577.         REPLACE PATH WITH DBF(), TYPE WITH 'fpc', fox_file WITH .T.
  578.  
  579.     ENDPROC
  580.  
  581.     *------------------------------------
  582.     FUNCTION SetFoxFile
  583.     *------------------------------------
  584.         PARAMETERS m.wzstype, m.wzlForceExt
  585.  
  586.         PRIVATE m.wzsselect, m.wzs1, m.wzs2
  587.  
  588.         m.wzsselect = SELECT()
  589.         SELECT (THIS.new30alias)
  590.         m.wzs1 = path
  591.         m.wzs2 = file_name
  592.         IF m.wzlForceExt
  593.             REPLACE path WITH UPPER(ForceExt(SYS(2027,m.wzs1),m.wzstype)), ;
  594.                 file_name WITH UPPER(ForceExt(SYS(2027,m.wzs2),m.wzstype)), ;
  595.                 fox_file WITH .T., ;
  596.                 type WITH m.wzstype
  597.         ELSE
  598.             REPLACE fox_file WITH .T., ;
  599.                 type WITH m.wzstype
  600.         ENDIF
  601.         SELECT (m.wzsselect)
  602.  
  603.     ENDPROC
  604.  
  605.     *------------------------------------
  606.     FUNCTION migrate
  607.     *------------------------------------
  608.         PARAMETERS m.wzsfname, m.wzstype, m.wzlconfirm
  609.         
  610.         PRIVATE m.wzsnewname, m.savearea
  611.  
  612.         LOCAL m.oThis, m.npos
  613.  
  614.         IF m.wzlconfirm
  615.             IF MESSAGEBOX(STRTRAN(C_CONFIRM1_LOC,"@1",PROPER(m.wzstype)),MB_YESNO) = IDNO
  616.                 RETURN .F.
  617.             ENDIF
  618.         ENDIF
  619.  
  620.         THIS.WriteLog(m.wzsfname,E_MIGSTART_LOC)
  621.         
  622.         m.oThis = THIS
  623.         
  624.         DO CASE
  625.             CASE m.wzstype='QUERY'
  626.                 *- strip off binary portion of QBE file, and
  627.                 *- write file out as a .PRG
  628.                 *- binary portion begins after a CTL-Z
  629.                 m.savearea = SELECT()
  630.  
  631.                 IF USED("_FOX3SPR")
  632.                   USE IN _FOX3SPR
  633.                 ENDIF
  634.  
  635.                 CREATE CURSOR _FOX3SPR (temp1 m)
  636.                 APPEND BLANK
  637.  
  638.                 m.wzsnewname = ForceExt(SYS(2027,m.wzsfname),'PRG')
  639.                 APPEND MEMO _FOX3SPR.temp1 FROM (m.wzsfname) OVERWRITE
  640.                 m.npos = AT(C_DBASEEOF,_FOX3SPR.temp1)
  641.                 IF m.npos > 0
  642.                     REPLACE _FOX3SPR.temp1 WITH LEFT(_FOX3SPR.temp1,m.npos - 1)
  643.                 ENDIF
  644.                 COPY MEMO _FOX3SPR.temp1 TO (m.wzsnewname)
  645.                 USE IN _FOX3SPR
  646.                 SELECT (m.savearea)
  647.  
  648.             CASE m.wzstype='FORM'
  649.                 m.wzsnewname=ForceExt(SYS(2027,m.wzsfname),'SCX')
  650.                 IF !MigDB4(m.wzsfname, @oThis)
  651.                     THIS.WriteLog(m.wzsfname,E_NOMIG_LOC)
  652.                     RETURN .F.
  653.                 ENDIF
  654.             CASE m.wzstype='REPORT'
  655.                 m.wzsnewname=ForceExt(SYS(2027,m.wzsfname),'FRX')
  656.                 IF !MigDB4(m.wzsfname, @oThis)
  657.                     THIS.WriteLog(m.wzsfname,E_NOMIG_LOC)
  658.                     RETURN .F.
  659.                 ENDIF
  660.             CASE m.wzstype='LABEL'
  661.                 m.wzsnewname=ForceExt(SYS(2027,m.wzsfname),'LBX')
  662.                 IF !MigDB4(m.wzsfname, @oThis)
  663.                     THIS.WriteLog(m.wzsfname,E_NOMIG_LOC)
  664.                     RETURN .F.
  665.                 ENDIF
  666.         ENDCASE
  667.         
  668.         IF !FILE(m.wzsnewname)
  669.             =MESSAGEBOX(STRTRAN(E_NOFIND_LOC,"@1",PROPER(m.wzsfname)))
  670.             THIS.WriteLog(m.wzsfname,E_NOMIG_LOC)
  671.             RETURN .F.
  672.         ENDIF
  673.         
  674.         m.wzsfname=m.wzsnewname
  675.  
  676.         THIS.WriteLog(m.wzsfname,E_MIGEND_LOC)
  677.  
  678.         RETURN.T.
  679.  
  680.     ENDFUNC
  681.  
  682. ENDDEFINE    && DB4CatConverter
  683.  
  684. **********************************************
  685. DEFINE CLASS FmtConverter AS ForeignConverterBase
  686. **********************************************
  687.  
  688.     lDBFOpen = .F.            && flag when fmtDbf is open
  689.     lThisOpen = .F.            && flag set true if cThisAlias is open
  690.     cThisAlias = ""
  691.     cFmtAlias = ""            && alias of work fmtDbf workarea
  692.     lNixNewSCX = .F.        && flag set .T. if need to erase new scx file when cancel
  693.     barCount = 0
  694.     cFmtDbf = ""
  695.     chooseVar = 3
  696.     finish = .F.            && flag set to true if READ statement encountered; tells thermometer to fill
  697.     cRootName = ""
  698.     cPathName = ""
  699.     cTempDBF = ""            && name of table into which fmt is read--erase in cleanup
  700.     cTempName = ""            && alias of tempdbf -- close at cleanup
  701.     lTempOpen = .F.            && flag set true if tempDbf is open
  702.  
  703.     *------------------------------------
  704.     PROCEDURE Init            && FmtConverter
  705.     *------------------------------------
  706.         *- only if called from Project
  707.         PARAMETER aParms
  708.         
  709.         LOCAL nFileReady
  710.         
  711.         THIS.old25file = aParms[4]
  712.         THIS.cRootName = JustStem(THIS.old25file)
  713.         THIS.cPathName = JustPath(THIS.old25file) + "\"
  714.         THIS.cNew30File = LEFT(THIS.old25file,(LEN(THIS.old25file)-4)) + "." + C_SCXEXT
  715.  
  716.         *- Check to see if the fmt file is readable
  717.         IF !Readable(THIS.old25file)
  718.             =MESSAGEBOX(E_NOOPENSRC_LOC + ALLT(THIS.old25file))
  719.             THIS.lHadError = .T.
  720.             THIS.CleanUp
  721.             RETURN
  722.         ENDIF
  723.         
  724.         *- Check for a screen with same name; ask to overwrite if yes
  725.         *IF FILE(THIS.cNew30File) AND !THIS.Ok2Nuke(THIS.cNew30File)
  726.         *    THIS.CleanUp
  727.         *    THIS.lHadError = .T.
  728.         *    RETURN
  729.         *ELSE
  730.             THIS.lNixNewSCX = .T.    && flag to let abort know to erase cNew30File
  731.         *ENDIF
  732.  
  733.         RETURN
  734.         
  735.     *------------------------------------
  736.     FUNCTION Converter            && FmtConverter
  737.     *------------------------------------
  738.         
  739.         DECLARE avline[256,4]               && keep track of vertical lines: for each col, 1 = start, 2 = end, 3 = colorpr, 4 = single?
  740.         STORE -1 TO avline
  741.  
  742.         THIS.nTmpCount = 1
  743.         THIS.nRecCount = 100
  744.  
  745.         gOTherm.SetTitle(C_THERMMSG13_LOC + LOWER(PARTIALFNAME(THIS.old25file,C_FILELEN)))
  746.         gOTherm.Update(THIS.nTmpCount/THIS.nRecCount*100)
  747.  
  748.         THIS.cTempDBF = SYS(3)
  749.         CREATE TABLE (THIS.cTempDBF) (LINE C(254))        && Temporary table to hold text file
  750.         THIS.cTempName = ALIAS()
  751.         THIS.lTempOpen = .T.
  752.  
  753.         *- Read in the data from the text file
  754.         APPEND FROM (THIS.old25file) SDF
  755.  
  756.         *- set codepage
  757.         USE
  758.         IF !CPTag(THIS.cTempDBF + ".DBF",CPCURRENT(2))
  759.             *- reopen so Cleanup can dispose of properly
  760.             USE (THIS.cTempDBF)
  761.             THIS.CleanUp
  762.             THIS.lHadError = .T.
  763.             RETURN .F.
  764.         ENDIF
  765.         USE (THIS.cTempDBF) EXCLUSIVE
  766.  
  767.         THIS.nRecCount = RECC()
  768.  
  769.         THIS.Create25SCX(THIS.cNew30File)
  770.         THIS.cThisAlias = ALIAS()
  771.         THIS.lThisOpen = .T.
  772.  
  773.         APPEND BLANK
  774.         REPLACE newfile.objtype WITH 1,  ;
  775.             newfile.objcode WITH 63 &&10
  776.  
  777.         *- Options for Wizards
  778.         *- window title, float, centered, single border, + support for 
  779.         *- PG UP & PG DN
  780.         REPLACE newfile.style WITH 2,;
  781.                 newfile.height WITH 20,;
  782.                 newfile.width WITH 76,;
  783.                 newfile.tag WITH '"' + PROPER(JustStem(THIS.old25file)) + '"',;
  784.                 newfile.gridv WITH 1,;
  785.                 newfile.gridh WITH 1,;
  786.                 newfile.whentype WITH 1,;
  787.                 newfile.validtype WITH 1,;
  788.                 newfile.showtype WITH 1,;
  789.                 newfile.activtype WITH 1,;
  790.                 newfile.deacttype WITH 1,;
  791.                 newfile.proctype WITH 1,;
  792.                 newfile.setuptype WITH 1,;
  793.                 newfile.float WITH .T.,;
  794.                 newfile.close WITH .T.,;
  795.                 newfile.border WITH 4,;
  796.                 newfile.center WITH .T.,;
  797.                 newfile.minimize WITH .T.,;
  798.                 newfile.scheme WITH 8,;
  799.                 newfile.scheme2 WITH 9,;
  800.                 newfile.deactivate WITH "CLEAR READ" + C_CRLF,;
  801.                 newfile.setupcode WITH "PUSH KEY" + C_CRLF + ;
  802.                     "ON KEY LABEL PGUP DO dopgup" + C_CRLF + ;
  803.                     "ON KEY LABEL PGDN DO dopgdn" + C_CRLF + ;
  804.                     "ON KEY LABEL CTRL+PGUP DO ctlpgup" + C_CRLF + ;
  805.                     "ON KEY LABEL CTRL+PGDN DO ctlpgdn" + C_CRLF + ;
  806.                     "IF EOF()" + C_CRLF + ;
  807.                     "  GO BOTTOM" + C_CRLF + ;
  808.                     "ENDIF" + C_CRLF
  809.             *- Append navigation code & alert screen from
  810.             APPEND MEMO newfile.proccode FROM mignavpr.txt OVERWRITE
  811.  
  812.             REPLACE newfile.environ with .T.
  813.  
  814.             *- determine which tables are used in the screen
  815.             PRIVATE aScrTables
  816.             DECLARE aScrTables[1]
  817.             STORE "" TO aScrTables
  818.             SELECT (THIS.cTempName)
  819.             THIS.GetTables(@aScrTables)
  820.  
  821.             SELECT newfile
  822.             m.ntables = ALEN(aScrTables)
  823.             IF m.ntables = 1 AND EMPTY(aScrTables[1])
  824.                 *- no tables were found
  825.             ELSE
  826.                 REPLACE environ WITH .T.
  827.                 FOR m.nctr = 1 TO ALEN(aScrTables)
  828.                     append blank
  829.                     replace objtype with 2, objcode with m.nctr, name with aScrTables[m.nctr] + ".DBF", unique with .T. ;
  830.                         tag with ALLT(aScrTables[m.nctr])
  831.                 NEXT
  832.             ENDIF
  833.  
  834.             DIMENSION pname[10]                              &&define @ options names in an array
  835.             pname[1]="SAY"
  836.             pname[2]="GET"
  837.             pname[3]="PICT"
  838.             pname[4]="FUNC"
  839.             pname[5]="VALID"
  840.             pname[6]="WHEN"
  841.             pname[7]="COLO"
  842.             pname[8]="MESS"
  843.             pname[9]="RANG"
  844.             pname[10]="ERRO"
  845.  
  846.             SELECT (THIS.cTempName)
  847.             *- Start processing each line in the temporary file
  848.             SCAN
  849.                gOTherm.Update(RECNO()/RECC() * 100)
  850.                ucline=UPPER(ALLTRIM(line))
  851.                IF ucline="READ"
  852.                   finish=.T.
  853.                   gOTherm.Complete
  854.                   EXIT
  855.                ENDIF
  856.  
  857.                *- Ignore lines not starting with @ or those containing CLEAR TO or FILL TO
  858.                IF LEFT(ucline,1) <>"@" .OR. "CLEAR TO"$ucline .OR. "FILL TO"$ucline .OR. "PROM"$ucline .OR. "MENU"$ucline
  859.                   LOOP
  860.                ENDIF
  861.                getsay = .F.                                    && is there a get and a say
  862.                
  863.                txt = ALLTRIM(SUBS(LINE,AT("@",LINE)+1))
  864.                IF RIGHT(txt,1)=";"                           && line continues
  865.                   txt=";"
  866.                   SCAN WHILE RIGHT(txt,1)=";"
  867.                      txt=LEFT(txt,LEN(txt)-1)+ALLTRIM(LINE)
  868.                   ENDSCAN
  869.                   SKIP-1                                     && reposition pointer
  870.                   txt=ALLTRIM(SUBS(txt,AT("@",txt)+1))       &&remove @
  871.                ENDIF
  872.                
  873.                DO WHILE "  "$txt                             &&remove double spaces
  874.                   txt=STRTRAN(txt,"  "," ")                  &&remove double spaces
  875.                ENDDO
  876.                *- accommodate single quotes inside messages etc. (jd 6/23/94)
  877.                *txt=STRTRAN(txt,"'",'"')                      &&convert single quotes to double
  878.                txt=STRTR(txt,CHR(9)," ")                     &&Replace TABS with a space
  879.                m.row=LEFT(txt,AT(",",txt)-1)
  880.                txt=LTRIM(SUBS(txt,AT(",",txt)+1))
  881.                m.col=LEFT(txt,AT(" ",txt)-1)
  882.                IF " BOX "$ucline
  883.                   txt=LTRIM(SUBS(txt,AT(",",txt)+1))
  884.                ELSE
  885.                   txt=LTRIM(SUBS(txt,AT(" ",txt)+1))
  886.                ENDIF
  887.                SELECT (THIS.cThisAlias)
  888.                APPEND BLANK
  889.                REPLACE vpos WITH VAL(m.row),hpos WITH VAL(m.col)
  890.                
  891.                *- LINE OR BOX
  892.                IF UPPER(LEFT(txt,3))="TO" .OR. " BOX "$ucline
  893.                   IF " DOUB"$ucline
  894.                      REPLACE objcode WITH 5,objtype WITH 7,fillchar WITH CHR(0)
  895.                   ELSE
  896.                      REPLACE objcode WITH 4,objtype WITH 7,fillchar WITH CHR(0)
  897.                   ENDIF
  898.                   IF UPPER(txt)="TO"
  899.                      txt=SUBS(txt,3)
  900.                   ENDIF
  901.                   m.height=VAL(LEFT(txt,AT(",",txt)-1))+1
  902.                   txt=SUBS(txt,AT(",",txt)+1)
  903.                   m.width=VAL(txt)+1
  904.                   REPLACE HEIGHT WITH m.height-vpos,WIDTH WITH IIF(m.width-hpos=0,1,m.width-hpos)
  905.                   =cvtLine(@avline)
  906.                   LOOP
  907.                ENDIF
  908.                
  909.                DIMENSION gpos[11],options[10]
  910.                FOR x=1 TO 10
  911.                   gpos[X]=AT(pname[X],UPPER(txt))
  912.                ENDFOR
  913.                gpos[11]=LEN(txt)+1
  914.                =ASORT(gpos)
  915.                IF "GET"$ucline .AND. "SAY"$ucline
  916.                   getsay=.T.
  917.                ENDIF
  918.                FOR x=1 TO 10
  919.                   IF gpos[X]=0                               && option not used
  920.                      options[X]=""
  921.                      LOOP
  922.                   ENDIF
  923.                   options[X]=SUBS(txt,gpos[X],gpos[X+1]-gpos[X])
  924.                   thisopt=ALLTRIM(SUBS(options[X],AT(" ",options[X])+1))
  925.                   optname=LEFT(UPPER(options[X]),4)
  926.                   
  927.                   IF optname="SAY"
  928.                      *- accommodate single quotes inside messages etc. (jd 6/23/94)
  929.                      IF OCCURS('"',thisopt)=2 .AND. LEFT(thisopt,1)='"' .AND. RIGHT(thisopt,1)='"' OR ;
  930.                         OCCURS("'",thisopt)=2 .AND. LEFT(thisopt,1)="'" .AND. RIGHT(thisopt,1)="'" &&text
  931.                         REPLACE objtype WITH 5,objcode WITH 0,expr WITH thisopt,;
  932.                            HEIGHT WITH 1,WIDTH WITH LEN(thisopt)-2 &&-2 for quotes
  933.                      ELSE                                    &&expression
  934.                         REPLACE objtype WITH 15,objcode WITH 0,expr WITH thisopt,;
  935.                            HEIGHT WITH 1,WIDTH WITH 10,REFRESH WITH .T.
  936.                      ENDIF
  937.                   ENDIF
  938.                   pictwidth=0                                &&set picture width to 0
  939.                   IF optname="GET"                           &&get
  940.                      IF getsay
  941.                         thisvpos=vpos
  942.                         thishpos=hpos+LEN(expr)-1
  943.                         APPEND BLANK
  944.                         REPLACE vpos WITH thisvpos,hpos WITH thishpos
  945.                      ENDIF
  946.                      IF " "$thisopt                          &&strip out options
  947.                         thisopt=LEFT(thisopt,AT(" ",thisopt)-1)
  948.                      ENDIF
  949.                      REPLACE objtype WITH 15,objcode WITH 1,name WITH thisopt,;
  950.                         HEIGHT WITH 1
  951.                      thiswidth=0
  952.                      IF THIS.ldbfopen
  953.                         IF ">"$thisopt                       &&If alias found, find alias name
  954.                            aname=LEFT(thisopt,AT(">",thisopt)-2)
  955.                            fldname=SUBS(thisopt,AT(">",thisopt)+1) &&find field name
  956.                         ELSE
  957.                            aname=fmt_alias &&ALIAS(1)
  958.                            fldname=thisopt
  959.                         ENDIF
  960.                         IF aname=fmt_alias
  961.                             thiswidth=FSIZE(fldname,aname)
  962.                         ENDIF
  963.                      ENDIF
  964.                      IF thiswidth=0                          &&Maybe it's a variable
  965.                         DO CASE
  966.                         CASE TYPE(thisopt)="C"
  967.                            thiswidth=LEN(&thisopt)
  968.                         CASE TYPE(thisopt)="N"
  969.                            thiswidth=LEN(STR(&thisopt))
  970.                         CASE TYPE(thisopt)="D"
  971.                            thiswidth=8
  972.                         ENDCASE
  973.                      ENDIF
  974.                      REPLACE WIDTH WITH IIF(thiswidth=0,10,thiswidth)
  975.                   ENDIF
  976.                   IF optname="PICT"
  977.                      REPLACE PICTURE WITH thisopt,WIDTH WITH LEN(PICTURE)-2
  978.                   ENDIF
  979.                   IF optname="FUNC"
  980.                      IF LEN(PICTURE)>0
  981.                         thispict=SUBS(PICTURE,2,LEN(PICTURE)-2)
  982.                         thisopt='"@'+SUBS(thisopt,2,LEN(thisopt)-2)+' '+thispict
  983.                      ELSE
  984.                         thisopt=STUF(thisopt,2,0,"@")
  985.                      ENDIF
  986.                      REPLACE PICTURE WITH thisopt
  987.                   ENDIF
  988.                   IF optname="VALI"
  989.                      REPLACE VALID WITH thisopt
  990.                   ENDIF
  991.                   IF optname="WHEN"
  992.                      REPLACE WHEN WITH thisopt
  993.                   ENDIF
  994.                   IF optname="COLO"
  995.                      thisopt=SUBS(thisopt,2,LEN(thisopt)-2)  &&STRIP OUT QUOTES
  996.                      REPLACE colorpair WITH thisopt
  997.                   ENDIF
  998.                   IF optname="MESS"
  999.                      REPLACE MESSAGE WITH thisopt
  1000.                   ENDIF
  1001.                   IF optname="RANG"
  1002.                      REPLACE rangelo WITH LEFT(thisopt,AT(",",thisopt)-1)
  1003.                      IF ","$thisopt
  1004.                         REPLACE rangehi WITH SUBS(thisopt,AT(",",thisopt)+1)
  1005.                      ENDIF
  1006.                   ENDIF
  1007.                   IF optname="ERRO"
  1008.                      REPLACE ERROR WITH thisopt
  1009.                   ENDIF
  1010.                ENDFOR
  1011.                SELECT (THIS.cTempName)
  1012.             ENDSCAN
  1013.             =FixVert(@avline)
  1014.             select (THIS.cThisAlias)
  1015.             replace all platform with "DOS", uniqueid with sys(2015)
  1016.             PRIVATE scrheight,m.nmaxwidth, m.nmaxheight
  1017.             GO TOP
  1018.             scrheight = newfile.height
  1019.             SCAN
  1020.                 scrheight = MAX(m.scrheight, newfile.vpos + newfile.height)
  1021.             ENDSCAN
  1022.             GO TOP
  1023.             REPLACE newfile.height WITH m.scrheight
  1024.             *SORT ON vpos, hpos TO (m.targetname)
  1025.             *USE (m.targetname)
  1026.             CALCULATE MAX(hpos + width),MAX(vpos + height) FOR RECNO() > 1 ;
  1027.                 TO m.nmaxwidth, m.nmaxheight
  1028.             GO TOP
  1029.             REPLACE width WITH MAX(width,m.nmaxwidth + 2),;
  1030.                 height WITH MAX(height,m.nmaxheight + 2) 
  1031.  
  1032.             select (THIS.cTempName)
  1033.  
  1034.             THIS.cleanup
  1035.  
  1036.  
  1037.             RETURN .T.
  1038.             
  1039.     ENDFUNC        &&  Converter
  1040.     
  1041.     *------------------------------------
  1042.     FUNCTION GetTables            && FmtConverter
  1043.     *------------------------------------
  1044.         PARAMETER aScrTables
  1045.  
  1046.         LOCAL ctable, noldlen
  1047.         
  1048.         *- go through open file, and look for table names
  1049.         *- assume table is open with text of FMT file, and selected
  1050.         
  1051.         LOCATE FOR "->" $ line
  1052.         DO WHILE NOT EOF()
  1053.             m.ctable = LEFT(line,AT("->",line) - 1)
  1054.             m.ctable = SUBS(m.ctable, RAT(" ",m.ctable) + 1)
  1055.             IF FILE(THIS.cpathname + m.ctable + ".DBF")
  1056.                 *- add to array?
  1057.                 IF ASCAN(aScrTables,m.ctable) = 0
  1058.                     m.noldlen = ALEN(aScrTables)
  1059.                     IF m.noldlen = 1 AND EMPTY(aScrTables[1])
  1060.                         aScrTables[1] = ALLT(m.ctable)
  1061.                     ELSE
  1062.                         DECLARE aScrTables[m.noldlen + 1]
  1063.                         aScrTables[m.noldlen + 1] = ALLT(m.ctable)
  1064.                     ENDIF
  1065.                 ENDIF
  1066.             ENDIF
  1067.             CONTINUE
  1068.         ENDDO
  1069.         RETURN
  1070.  
  1071.     ENDFUNC
  1072.     
  1073.     *------------------------------------
  1074.     PROCEDURE Cleanup            && FmtConverter
  1075.     *------------------------------------
  1076.            IF USED(THIS.cthisalias)
  1077.                SELECT (THIS.cthisalias)
  1078.                USE
  1079.            ENDIF
  1080.            
  1081.            IF USED(THIS.cTempName)
  1082.                 SELECT (THIS.cTempName)
  1083.                    USE
  1084.                    IF FILE(THIS.cTempDBF+".dbf")
  1085.                     ERASE (THIS.cTempDBF+".dbf")
  1086.                 ENDIF
  1087.            ENDIF
  1088.                
  1089.             IF USED(THIS.cfmtAlias)
  1090.                 SELECT (THIS.cfmtAlias)
  1091.                 USE
  1092.             ENDIF
  1093.             
  1094.         RETURN
  1095.  
  1096.     ENDFUNC
  1097.     
  1098.  
  1099. ENDDEFINE            && FmtConverter
  1100.  
  1101. *-
  1102. *- eof Foreign.PRG
  1103. *-