* Version 5.1 LPARAMETERS cCur,lcFileName,llHead,lnMaxIndexLen,lcFFields,llMemoAsComment,lnCodePage,llOpen * Parameters * cCur name of the table / cursor * lcFileName name of the xlsx * llHead .T. first row of xlsx contain column names * lnMaxIndexLen optional, maximum length of the indexes. A value between 19 and 120. Default 60 * lcFFields optional, list of fields to be outputed * llMemoAsComment optional, memo fields are converted into comments while the cell contains the word "Memo" * lnCodePage optional, codepage used for strings * llOpen optional, .T. the file is open (default .F.) # DEFINE MAXIMUMCOMMENTHEIGHT 20 && maximum height of a comment (expressed in sheet rows) # DEFINE MAXIMUMCOMMENTWIDTH 10 && maximum width of a comment (expressed in sheet columns) DECLARE INTEGER ShellExecute IN SHELL32.DLL INTEGER nWinHandle,STRING cOperation,STRING cFileName,STRING cParameters,STRING cDirectory,INTEGER nShowWindow IF OS(3) < '6' && XP Declare INTEGER GetLocaleInfo in Win32API LONG Locale, LONG LCType, STRING @LpLCData, INTEGER cchData ELSE Declare INTEGER GetLocaleInfoEx in Win32API String Locale, LONG LCType, STRING @LpLCData, INTEGER cchData ENDIF DECLARE Sleep IN kernel32 INTEGER #DEFINE ERRLANG "EN" #IF ERRLANG = "EN" #DEFINE ERRMESS1 "Abort" #DEFINE ERRMESS2 "Cannot create" #DEFINE ERRMESS3 "No xlsx generated" #DEFINE ERRMESS4 "Nothing to export" #DEFINE ERRMESS5 "Not a cursor/table name" #DEFINE ERRMESS6 "already exist." #DEFINE ERRMESS7 "Overwrite?" * thanks to Koen Piller #ELIF ERRLANG = "NL" #DEFINE ERRMESS1 "Sluiten" #DEFINE ERRMESS2 "Niet te maken:" #DEFINE ERRMESS3 "Geen xlsx gemaakt" #DEFINE ERRMESS4 "Niets te exporteren" #DEFINE ERRMESS5 "Geen cursor- of tabelnaam" #DEFINE ERRMESS6 "bestaat al." #DEFINE ERRMESS7 "Overschrijven?" * thanks to Alejandro Garcia #ELIF ERRLANG = "ES" #DEFINE ERRMESS1 "Abortar" #DEFINE ERRMESS2 "No se puede crear" #DEFINE ERRMESS3 "Ningún xslx generado" #DEFINE ERRMESS4 "Nada que exportar" #DEFINE ERRMESS5 "No es un nombre de cursor/tabla" #DEFINE ERRMESS6 "ya existe." #DEFINE ERRMESS7 "¿Sobreescribir?" #ELSE #DEFINE ERRMESS1 "Abandon" #DEFINE ERRMESS2 "Nu se poate crea" #DEFINE ERRMESS3 "Nu s-a generat xlsx" #DEFINE ERRMESS4 "Nimic de exportat" #DEFINE ERRMESS5 "Nume invalid de cursor/tabel" #DEFINE ERRMESS6 "exista deja." #DEFINE ERRMESS7 "Suprascrieti?" #ENDIF LOCAL lcMyPath,lcDir,loerr as Exception LOCAL lnRowsNo,lnColsNo,lnCurRow,lnCurCol,lnTime,ltTime,lcSetDec,lnColsNoAll,laFieldsAll[1],lnLenStr,lnLenIdx,llMemos,lnII,lSetTalk,lnFFields,laFFields[1] LOCAL cStrings,lnColChars,llCR,lcValue,lnDec,cMax,ldValue LOCAL lcCurr,lcTmp,lnj LOCAL ldDat01,ldDat11,ldDat02,ldDat12,ldDat03,ltDat02 LOCAL lnFHStr,lnFHSh,lcLenStr,lcLenIdx,lnCountbefore,lcUnion,lcField,lnTotal,cTotal,lcCurRow,ofile,lcSource,lcZipFileName,oShell,oFolder,llBelow7 LOCAL laFields[1,6],lnType,lala[1],lcSetPoint,lnFHCo,lnFHDr,lnCurComm,lnNoRow,laNoRow[1],lniNoRow,lnMaxLenRow,lnCommW,lnCommH LOCAL lcCurrAlias,llToClose,lcCodePage,lcOldPath,lcStrBad lcStrBad = '' FOR lni = 0 TO 31 IF !INLIST(m.lni,9,10,13) lcStrBad = m.lcStrBad + CHR(m.lni) ENDIF NEXT lcCurrAlias = ALIAS() llToClose = .F. IF PCOUNT() < 1 MESSAGEBOX(ERRMESS4,48,ERRMESS3) RETURN ELSE IF VARTYPE(m.cCur) == "C" IF !USED(m.cCur) USE (m.cCur) IN 0 llToClose = .T. ENDIF ELSE MESSAGEBOX(ERRMESS5,48,ERRMESS3) RETURN ENDIF ENDIF IF PCOUNT() < 2 lcFileName = FORCEEXT(SYS(2015),"xlsx") ELSE IF VARTYPE(m.lcFileName) == "C" lcFileName = FORCEEXT(m.lcFileName,"xlsx") ELSE lcFileName = FORCEEXT(SYS(2015),"xlsx") ENDIF ENDIF IF PCOUNT() < 3 llHead = .F. ELSE IF VARTYPE(m.llHead) <> "L" llHead = .F. ENDIF ENDIF IF PCOUNT()<4 lnMaxIndexLen = 60 ELSE IF VARTYPE(m.lnMaxIndexLen) $ "NY" lnMaxIndexLen = INT(m.lnMaxIndexLen) ELSE lnMaxIndexLen = 60 ENDIF lnMaxIndexLen = MIN(MAX(m.lnMaxIndexLen,19),120) ENDIF IF FILE(FORCEEXT(m.lcFileName,"xlsx")) IF MESSAGEBOX(FORCEEXT(m.lcFileName,"xlsx")+" "+ERRMESS6+CHR(13)+ERRMESS7,4+48,ERRMESS3) = 7 RETURN ELSE ERASE (FORCEEXT(m.lcFileName,"xlsx")) RECYCLE ENDIF ENDIF lnFFields = 0 IF PCOUNT()<5 lcFFields = "" ELSE IF VARTYPE(m.lcFFields) <> "C" lcFFields = "" ELSE lnFFields = ALINES(laFFields,UPPER(m.lcFFields),1+4,",") ENDIF ENDIF IF PCOUNT() < 6 llMemoAsComment = .F. ELSE IF VARTYPE(m.llMemoAsComment) <> "L" llMemoAsComment = .F. ENDIF ENDIF * Thanks to Gregory Green IF PCOUNT() < 7 lcCodePage = '' ELSE IF VARTYPE(m.lnCodePage) <> "N" lcCodePage = '' ELSE IF !INLIST(m.lnCodePage,437,620,737,850,852,857,861,865,866,874,895,932,936,949,950,1250,1251,1252,1253,1254,1255,1256) lcCodePage = '' ELSE lcCodePage = 'CODEPAGE = ' + TRANSFORM(m.lnCodePage) ENDIF ENDIF ENDIF IF PCOUNT() < 8 llOpen = .F. ELSE IF VARTYPE(m.llOpen) <> "L" llOpen = .F. ENDIF ENDIF lSetTalk = SET("Talk") SET TALK OFF lcSetPoint = SET("Point") SET POINT TO "." lnColsNoAll=AFIELDS(m.laFieldsAll,m.cCur) lnColsNo = 0 lnLenStr = 19 && for datetime llMemos = .F. lcUnion = "" cTotal = SYS(2015) lnTotal = 0 ldDat01 = DATE(1900,3,1) ldDat02 = DATE(1900,1,1) ldDat03 = DATE(1900,2,28) ldDat11 = m.ldDat01 - 61 ldDat12 = m.ldDat02 - 1 ltDat02 = DATETIME(1900,1,1,0,0,0) lnColChars = 0 LOCAL lnActualCol lnActualCol = 0 FOR lnCurCol = 1 TO m.lnColsNoAll lnActualCol = m.lnActualCol + 1 IF m.laFieldsAll[m.lnCurCol,2] $ "G" lnActualCol = m.lnActualCol - 1 LOOP ENDIF IF m.laFieldsAll[m.lnCurCol,2] $ "NFYBIDTLCVM" IF !EMPTY(m.lcFFields) IF ASCAN(m.laFFields,laFieldsAll[m.lnCurCol,1],1,-1,-1,1+2+4)=0 LOOP ENDIF ENDIF lnColsNo = m.lnColsNo + 1 DIMENSION laFields[m.lnColsNo,6] laFields[m.lnColsNo,1] = laFieldsAll[m.lnCurCol,1] laFields[m.lnColsNo,2] = IIF(laFieldsAll[m.lnCurCol,2] $ "CV",1,; IIF(laFieldsAll[m.lnCurCol,2] $ "NF",2,; IIF(laFieldsAll[m.lnCurCol,2] == "I",3,; IIF(laFieldsAll[m.lnCurCol,2] == "D",4,; IIF(laFieldsAll[m.lnCurCol,2] == "T",5,; IIF(laFieldsAll[m.lnCurCol,2] == "L",6,; IIF(laFieldsAll[m.lnCurCol,2] == "Y",7,; IIF(laFieldsAll[m.lnCurCol,2] == "B",8,; IIF(laFieldsAll[m.lnCurCol,2] == "M",9,10))))))))) laFields[m.lnColsNo,6] = m.lnActualCol &&lnCurCol laFields[m.lnColsNo,3] = laFieldsAll[m.lnCurCol,3] laFields[m.lnColsNo,4] = laFieldsAll[m.lnCurCol,4] laFields[m.lnColsNo,5] = IIF(m.lnColsNo<=26,[],CHR(64+FLOOR((m.lnColsNo-1)/26)))+CHR(65+MOD(m.lnColsNo-1,26)) ELSE LOOP ENDIF lcField = laFieldsAll[m.lnCurCol,1] IF m.laFieldsAll[m.lnCurCol,2] $ "CV" lnLenStr = MAX(m.lnLenStr, laFieldsAll[m.lnCurCol,3]) IF !EMPTY(m.lcUnion) lcUnion = m.lcUnion + " UNION" ENDIF lcUnion = m.lcUnion + " SELECT DISTINCT CAST(RTRIM(" + m.lcField + ") AS V("+TRANSFORM(m.laFieldsAll[m.lnCurCol,3])+")) FROM " + m.cCur + " WHERE !ISNULL(" + m.lcField + ")" SELECT COUNT(*) as no FROM (m.cCur) WHERE ISNULL(&lcField) INTO CURSOR (m.cTotal) lnTotal = m.lnTotal + RECCOUNT(m.cCur) - &cTotal..no ENDIF IF m.laFieldsAll[m.lnCurCol,2] == "D" IF !EMPTY(m.lcUnion) lcUnion = m.lcUnion + " UNION" ENDIF lcUnion = m.lcUnion + " SELECT DISTINCT DTOC(" + m.lcField + ") FROM " + m.cCur + " WHERE " + m.lcField + " < m.ldDat02 " SELECT COUNT(*) as no FROM (m.cCur) WHERE &lcField < m.ldDat02 INTO CURSOR (m.cTotal) lnTotal = m.lnTotal + &cTotal..no ENDIF IF m.laFieldsAll[m.lnCurCol,2] == "T" IF !EMPTY(m.lcUnion) lcUnion = m.lcUnion + " UNION" ENDIF lcUnion = m.lcUnion + " SELECT DISTINCT TTOC(" + m.lcField + ") FROM " + m.cCur + " WHERE " + m.lcField + " < m.ltDat02 " SELECT COUNT(*) as no FROM (m.cCur) WHERE &lcField < m.ltDat02 INTO CURSOR (m.cTotal) lnTotal = m.lnTotal + &cTotal..no ENDIF IF m.laFieldsAll[m.lnCurCol,2] == "M" lnColChars = m.lnColChars +1 llMemos = .T. ENDIF NEXT lnLenIdx = MIN(m.lnMaxIndexLen, m.lnLenStr) lnTotal = m.lnTotal + m.lnColsNo SELECT (m.cCur) COUNT TO m.lnRowsNo lnTotal = m.lnTotal + m.lnRowsNo * m.lnColChars lnRowsNo=m.lnRowsNo+IIF(m.llHead,1,0) FOR lni = 1 TO m.lnFFields FOR lnCurCol = 1 TO m.lnColsNo IF m.laFields[m.lnCurCol,1] == m.laFFields[m.lni] FOR lnj = 1 TO ALEN(laFields,2) lcTmp = m.laFields[m.lnCurCol,m.lnj] laFields[m.lnCurCol,m.lnj] = m.laFields[m.lni,m.lnj] laFields[m.lni,m.lnj] = m.lcTmp NEXT EXIT ENDIF NEXT NEXT FOR lnCurCol = 1 TO m.lnColsNo laFields[m.lnCurCol,5] = IIF(m.lnCurCol<=26,[],CHR(64+FLOOR((m.lnCurCol-1)/26)))+CHR(65+MOD(m.lnCurCol-1,26)) NEXT SELECT (m.cCur) COUNT TO m.lnRowsNo lnTotal = m.lnTotal + m.lnRowsNo * m.lnColChars lnRowsNo=m.lnRowsNo+IIF(m.llHead,1,0) cStrings = SYS(2015) cMax = SYS(2015) CREATE CURSOR (m.cStrings) &lcCodePage (ii I AUTOINC NEXTVALUE 0,cStr V(m.lnLenStr),cM M) IF m.llMemoAsComment and m.llMemos INSERT INTO (m.cStrings) (cStr) VALUES ("Memo") ENDIF IF !EMPTY(m.lcUnion) EXECSCRIPT("LPARAMETERS ldDat02,ltDat02"+CHR(13)+"INSERT INTO " + m.cStrings + " (cStr)" + m.lcUnion,m.ldDat02,m.ltDat02) ENDIF IF m.lnLenStr > 0 IF m.lnLenIdx >= m.lnLenStr INDEX on cStr TAG cStr ELSE lcLenIdx = LTRIM(STR(m.lnLenIdx)) INDEX on LEFT(cStr,&lcLenIdx) TAG cStr ENDIF ENDIF IF m.llMemos lcLenStr = LTRIM(STR(m.lnLenIdx)) && courtesy of Tobias B INDEX on LEFT(cM,&lcLenStr) TAG cM ENDIF SET ORDER TO cStr lcCurr = Getcurr(m.lcStrBad) && courtesy of Martina Jindrová lcOldPath = SYS(5)+SYS(2003) lcMyPath='' IF !EMPTY(JUSTPATH(m.lcFileName)) lcMyPath=ADDBS(JUSTPATH(m.lcFileName)) SET DEFAULT TO (m.lcMyPath) ELSE lcMyPath = ADDBS(JUSTPATH(FULLPATH(m.lcFileName))) ENDIF lcDir=gen_dirs(m.llMemoAsComment and m.llMemos) gen_Content_Types(m.lcDir,m.llMemoAsComment and m.llMemos) gen_rels(ADDBS(m.lcDir+[_rels])) gen_app(ADDBS(m.lcDir+[docProps])) gen_core(ADDBS(m.lcDir+[docProps])) gen_workbook(ADDBS(ADDBS(m.lcDir+[xl])+[_rels]),m.llMemoAsComment and m.llMemos) gen_styles(ADDBS(m.lcDir+[xl]),m.lcCurr,m.llMemoAsComment and m.llMemos) gen_workbook2(ADDBS(m.lcDir+[xl])) IF m.llMemoAsComment and m.llMemos gen_workbook3(ADDBS(ADDBS(ADDBS(m.lcDir+[xl])+[worksheets])+[_rels])) ENDIF * Begin sheet1 lnFHSh = FCREATE(ADDBS(ADDBS(m.lcDir+[xl])+[worksheets])+"sheet1.xml") IF m.lnFHSh < 0 MESSAGEBOX(ERRMESS2 + ' sheet1.xml',16,ERRMESS1) DO cleanup WITH m.lcDir,m.llMemoAsComment AND m.llMemos,m.llToClose,m.cCur,m.cTotal,m.cMax,m.cStrings,m.lcCurrAlias,m.lnFHSh,m.lnFHStr,m.lnFHCo,m.lnFHDr,m.lcOldPath RETURN ENDIF FWRITE(m.lnFHSh,[]+CHR(10)) FWRITE(m.lnFHSh,[ ]) FWRITE(m.lnFHSh,[]) *FWRITE(m.lnFHSh,[]) FWRITE(m.lnFHSh,[]) FWRITE(m.lnFHSh,[]) FWRITE(m.lnFHSh,[]) IF m.llMemoAsComment AND m.llMemos * Begin comments1 lnFHCo = FCREATE(ADDBS(m.lcDir+[xl])+"comments1.xml") IF m.lnFHCo < 0 MESSAGEBOX(ERRMESS2 + ' comments1.xml',16,ERRMESS1) DO cleanup WITH m.lcDir,m.llMemoAsComment AND m.llMemos,m.llToClose,m.cCur,m.cTotal,m.cMax,m.cStrings,m.lcCurrAlias,m.lnFHSh,m.lnFHStr,m.lnFHCo,m.lnFHDr,m.lcOldPath RETURN ENDIF FWRITE(m.lnFHCo,[]+CHR(10)) FWRITE(m.lnFHCo,[]) FWRITE(m.lnFHCo,[]) FWRITE(m.lnFHCo,[CopyToXlsx]) FWRITE(m.lnFHCo,[]) FWRITE(m.lnFHCo,[]) * Begin vmlDrawing1.vml lnFHDr = FCREATE(ADDBS(ADDBS(m.lcDir+[xl])+[drawings])+"vmlDrawing1.vml") IF m.lnFHDr < 0 MESSAGEBOX(ERRMESS2 + ' vmlDrawing1.vml',16,ERRMESS1) DO cleanup WITH m.lcDir,m.llMemoAsComment AND m.llMemos,m.llToClose,m.cCur,m.cTotal,m.cMax,m.cStrings,m.lcCurrAlias,m.lnFHSh,m.lnFHStr,m.lnFHCo,m.lnFHDr,m.lcOldPath RETURN ENDIF FWRITE(m.lnFHDr,[]+CHR(10)) FWRITE(m.lnFHDr,[]) FWRITE(m.lnFHDr,[]) FWRITE(m.lnFHDr,[]) FWRITE(m.lnFHDr,[]) FWRITE(m.lnFHDr,[]) FWRITE(m.lnFHDr,[]) FWRITE(m.lnFHDr,[]) FWRITE(m.lnFHDr,[]) ENDIF * Begin sharedStrings lnFHStr = FCREATE(ADDBS(m.lcDir+[xl])+"sharedStrings.xml") IF m.lnFHStr < 0 MESSAGEBOX(ERRMESS2 + ' sharedStrings.xml',16,ERRMESS1) DO cleanup WITH m.lcDir,m.llMemoAsComment AND m.llMemos,m.llToClose,m.cCur,m.cTotal,m.cMax,m.cStrings,m.lcCurrAlias,m.lnFHSh,m.lnFHStr,m.lnFHCo,m.lnFHDr,m.lcOldPath RETURN ENDIF FWRITE(m.lnFHStr,[]+CHR(10)) FWRITE(m.lnFHStr,[]) FOR lnCurCol = 1 TO m.lnColsNo FWRITE(m.lnFHSh,[]+LTRIM(STR(m.lnII))+[]) ELSE FWRITE(m.lnFHStr,[]+htmspec(m.lcValue,m.lcStrBad)+[]) INSERT INTO (m.cStrings) (cStr) VALUES (m.lcValue) SELECT MAX(ii) as ii FROM (m.cStrings) INTO CURSOR (m.cMax) SELECT (m.cMax) lnII = ii FWRITE(m.lnFHSh,[" t="s">]+LTRIM(STR(m.lnII))+[]) ENDIF NEXT FWRITE(m.lnFHSh,[]+CHR(10)) ENDIF lcSetDec = SET("Decimals") SET DECIMALS TO 13 IF m.llMemoAsComment AND m.llMemos lnCurComm = 0 ENDIF SELECT (m.cCur) DO CASE CASE m.llMemos AND m.lnLenIdx < m.lnLenStr SCAN lnCurRow = m.lnCurRow + 1 lcCurRow = LTRIM(STR(m.lnCurRow)) FWRITE(m.lnFHSh,[]) SCATTER MEMO TO lala FOR lnCurCol = 1 TO m.lnColsNo SET ORDER TO cStr IN (m.cStrings) lcValue = lala[m.laFields[m.lnCurCol,6]] IF ISNULL(m.lcValue) LOOP ENDIF lnType = m.laFields[m.lnCurCol,2] lnDec = m.laFields[m.lnCurCol,4] FWRITE(m.lnFHSh,[]) && Empty cell ELSE SELECT (m.cStrings) SET KEY TO LEFT(m.lcValue,m.lnLenIdx) SCAN IF cStr == m.lcValue EXIT ENDIF ENDSCAN SET KEY TO FWRITE(m.lnFHSh,[" t="s">]+LTRIM(STR(II))+[]) ENDIF SELECT (m.cCur) ELSE IF m.lnType == 2 FWRITE(m.lnFHSh,[">]+LTRIM(STR(m.lcValue,m.laFields[m.lnCurCol,3],m.lnDec))+[]) ELSE IF m.lnType == 3 FWRITE(m.lnFHSh,[">]+LTRIM(STR(m.lcValue))+[]) ELSE IF m.lnType == 4 IF EMPTY(m.lcValue) FWRITE(m.lnFHSh,[">]) && Empty cell ELSE IF m.lcValue >= m.ldDat01 FWRITE(m.lnFHSh,[" s="1">]+LTRIM(STR(m.lcValue - m.ldDat11))+[]) ELSE IF BETWEEN(m.lcValue,m.ldDat02,m.ldDat03) FWRITE(m.lnFHSh,[" s="1">]+LTRIM(STR(m.lcValue - m.ldDat12))+[]) ELSE lcValue = DTOC(m.lcValue) SELECT (m.cStrings) SET KEY TO LEFT(m.lcValue,m.lnLenIdx) SCAN IF cStr == m.lcValue EXIT ENDIF ENDSCAN SET KEY TO FWRITE(m.lnFHSh,[" t="s">]+LTRIM(STR(II))+[]) SELECT (m.cCur) ENDIF ENDIF ENDIF ELSE IF m.lnType == 5 IF EMPTY(m.lcValue) FWRITE(m.lnFHSh,[">]) && Empty cell ELSE ltTime = m.lcValue ldValue = TTOD(m.lcValue) lnTime = (m.ltTime-DATETIME(YEAR(m.ltTime),MONTH(m.ltTime),DAY(m.ltTime),0,0,0))/(86400.0) IF m.ldValue >= m.ldDat01 FWRITE(m.lnFHSh,[" s="2">]+LTRIM(STR(m.ldValue - m.ldDat11))+SUBSTR(TRANSFORM(m.lnTime),2,14)+[]) ELSE IF BETWEEN(m.ldValue,m.ldDat02,m.ldDat03) FWRITE(m.lnFHSh,[" s="2">]+LTRIM(STR(m.ldValue - m.ldDat12))+SUBSTR(TRANSFORM(m.lnTime),2,14)+[]) ELSE lcValue = TTOC(m.lcValue) SELECT (m.cStrings) SET KEY TO LEFT(m.lcValue,m.lnLenIdx) SCAN IF cStr == m.lcValue EXIT ENDIF ENDSCAN SET KEY TO FWRITE(m.lnFHSh,[" t="s">]+LTRIM(STR(II))+[]) SELECT (m.cCur) ENDIF ENDIF ENDIF ELSE IF m.lnType == 6 FWRITE(m.lnFHSh,[" t="b">]+IIF(m.lcValue ,[1],[0])+[]) ELSE IF m.lnType == 7 FWRITE(m.lnFHSh,[" s="4">]+LTRIM(STR(m.lcValue,21,4))+[]) ELSE IF m.lnType == 8 FWRITE(m.lnFHSh,[">]+LTRIM(STR(m.lcValue,21,m.lnDec))+[]) ELSE IF m.lnType == 9 lcValue = RTRIM(m.lcValue) IF m.llMemoAsComment lnCurComm = m.lnCurComm + 1 IF EMPTY(m.lcValue) FWRITE(m.lnFHSh,[" t="s">]) && Empty cell ELSE FWRITE(m.lnFHSh,IIF(m.llCR,[" s="3],[])+[" t="s">0]) && Type "Memo" in sheet1 FWRITE(m.lnFHCo,[]) && comments1 FWRITE(m.lnFHCo,[]) FWRITE(m.lnFHCo,[]) FWRITE(m.lnFHCo,[]) FWRITE(m.lnFHCo,[]) FWRITE(m.lnFHCo,[]) FWRITE(m.lnFHCo,[]) FWRITE(m.lnFHCo,[]) FWRITE(m.lnFHCo,[]) FWRITE(m.lnFHCo,[]) FWRITE(m.lnFHCo,[] + m.lcValue + []) FWRITE(m.lnFHCo,[]) FWRITE(m.lnFHCo,[]) FWRITE(m.lnFHCo,[]) FWRITE(m.lnFHDr,[