On 8/9/2011 3:02 PM, Mike Copeland wrote:
>> Mike,
>>
>> It would be a two pass thing, or a best guess. I would go with the best
>> guess.
>> A tight loop getting the data and dumping it as you get a total count, then
>> return to the top and begin processing.
>> If you did this, since you have multiple types of data in the file, you
>> could get a count of each type. Then show the progress of each type as you
>> do the real processing.
>>
>> The best guess, FSEEK() to the end returns the total number of bytes. You
>> can use this and add the bytes of each line to show the complete progress.
>>
>>
> Just test for FEOF() with each iteration. I've never had a problem doing
> that to "find the end."
Oh I know to use FEOF to test for the end of the loop, but I was
thinking that I could use FSIZE (with SET COMPATIBLE DB4) to get the
filesize in bytes, and then divide that by the record length, but
apparently my logic is flawed, because my loop was telling me
"Processing record 990123 of 636789" -- LOL
Doing the tight loop as Tracy mentioned should work, but it seems like a
kludge (but a necessary one!). I *do* like the idea of telling the user
how many records of each type ahead of time though!
Here's my logic so far (but the record count is off by seemingly twice
as much. Can you see why??!?!?
lcFileType = UPPER(RIGHT(JUSTSTEM(This.InputFile),2))
DO CASE
CASE lcFileType = "OP"
lnLength = 550
lnRecPosn = 54
* put other lengths in later after OP passes testing
OTHERWISE
SET STEP ON
ENDCASE
lnRows = lnFileSize / lnLength
liHandle = FOPEN(this.InputFile)
liCnt = 0
DO WHILE NOT FEOF(liHandle)
m.liCnt = m.liCnt + 1
m.LineOfText = FGETS(m.liHandle,m.lnLength) && according to VFP Help,
rec ptr is moved, so I don't need to use FSEEK
m.RecordType = SUBSTR(m.LineOfText,m.lnRecPosn,1)
WAIT WINDOW NOWAIT "Processing line " + ALLTRIM(STR(liCnt)) + " of " +
ALLTRIM(STR(lnRows))
DO CASE
CASE m.RecordType = "1"
This.ProcessType1(m.LineOfText)
CASE m.RecordType = "2"
This.ProcessType2(m.LineOfText)
CASE m.RecordType = "3"
This.ProcessType3(m.LineOfText)
CASE m.RecordType = "4"
This.ProcessType4(m.LineOfText)
OTHERWISE
* unknown type or EOF marker
IF LEN(m.LineOfText) > 1
SET STEP ON
This.LogIt("UT", "", m.LineOfText)
m.RogueCntr = m.RogueCntr + 1
This.ErrorCondition = .T.
*** mjb 2011/06/08 - changing so that if ANY errors occur,
program does not continue towards output file.
m.MsgTxt = "This file has an error. Processing will not
continue." + CHR(13)
m.MsgTxt = m.MsgTxt + "Please review DSHImportExport.LOG to see
the invalid data."
MESSAGEBOX(m.MsgTxt, 16, "Error: Invalid Data")
m.RetVal = .F.
EXIT
ENDIF
ENDCASE
ENDDO
FCLOSE(liHandle)
--
Mike Babcock, MCP
MB Software Solutions, LLC
President, Chief Software Architect
http://mbsoftwaresolutions.com
http://fabmate.com
http://twitter.com/mbabcock16
_______________________________________________
Post Messages to: [email protected]
Subscription Maintenance: http://leafe.com/mailman/listinfo/profox
OT-free version of this list: http://leafe.com/mailman/listinfo/profoxtech
Searchable Archive: http://leafe.com/archives/search/profox
This message:
http://leafe.com/archives/byMID/profox/[email protected]
** All postings, unless explicitly stated otherwise, are the opinions of the
author, and do not constitute legal or medical advice. This statement is added
to the messages for those lawyers who are too stupid to see the obvious.