考勤钟生成的二进制文件 attn.ter,每条考勤记录的长度为10个字节,前3位为日期,4/5位是时间,6位是出入类型,7-10位是IC卡编号。
问题是,怎样把下面的Foxpro程序翻译成Delphi的,急//------------------------Foxpro 源程序--------------------------------
PROCEDURE AppAttn
PRIVATE NFILE , CDATA
PRIVATE NPTR , DDATA
IF .NOT. FILE(CATTNDAT)
RETURN 0
ENDIF
NFILE = FOPEN(CATTNDAT)
IF NFILE = -1
RETURN 54
ENDIF
DO SHOWCOMM WITH '更新员工刷卡资料 ...'
USE IN 0 staff ORDER card_int
USE IN 0 visitor ORDER card_int
USE IN 0 visitdat
USE IN 0 (CDATAPATH + 'attn')
NPTR = 0
DCURR = DATE()
NTOTREC = 0
DO WHILE .NOT. FEOF(NFILE)
CDATA = FREAD(NFILE,10)
M.DATE = INT2DAYSTR(LEFT(CDATA,3)) //取日期
NPTR = NPTR + 10
DDATA = ;
CTOD(SUBSTR(M.DATE,7,2) + '/' + SUBSTR(M.DATE,5,2) + '/' + LEFT(M.DATE,4))
M.TIME = INT2TIMSTR(SUBSTR(CDATA,4,2)) //取时间
M.IO_TYPE = MIN(ASC(SUBSTR(CDATA,6,1)),99) //取出入类型
IF LFULLTENDIG
M.CARD = MIN(VAL(INT2CARD(RIGHT(CDATA,6))),9999999999) //取IC卡号
ELSE
M.CARD = MIN(VAL(INT2CARD(RIGHT(CDATA,4))),9999999999)
ENDIF
M.CARD_NO = STRTRAN(STR(M.CARD,NCARDLG),' ','0')
M.DOOR_NO = NCURRDOOR
M.SITE_NO = NCURRSITE
M.TER_NO = NCURRTER
IF M.IO_TYPE > 100
M.IO_TYPE = MIN(M.IO_TYPE - 100,99)
SELECT VISITOR
SEEK M.CARD
LFND = FOUND()
IF LFND
SCAN REST WHILE M.CARD = VAL(VISITOR.CARD_NO)
IF (DTOS(VISITOR.ADD_DATE) <= M.DATE) AND ;
(EMPTY(VISITOR.EXP_DATE) .OR. DTOS(VISITOR.EXP_DATE) >= M.DATE)
EXIT
ENDIF
ENDSCAN
IF M.CARD <> VAL(VISITOR.CARD_NO)
SKIP -1
ENDIF
ENDIF
IF LFND
M.VISIT_NO = VISITOR.VISIT_NO
SELECT VISITDAT
APPEND BLANK
GATHER MEMVAR
UNLOCK
ENDIF
ELSE
SELECT STAFF
SEEK M.CARD
IF FOUND()
SCAN REST WHILE M.CARD = VAL(STAFF.CARD_NO)
IF EMPTY(STAFF.EXP_DATE) .OR. DTOS(STAFF.EXP_DATE) >= M.DATE
EXIT
ENDIF
ENDSCAN
IF M.CARD <> VAL(STAFF.CARD_NO)
SKIP -1
ENDIF
ENDIF
M.EMP_NO = IIF(FOUND(),STAFF.EMP_NO,'* ' + STRTRAN(STR(M.CARD,NCARDLG),' ','0'))
SELECT ATTN
APPEND BLANK
GATHER MEMVAR
UNLOCK
NTOTREC = NTOTREC + 1
IF MOD(NTOTREC,100) = 0
DO SHOWCOMM WITH '已接收 ' + LTRIM(STR(NTOTREC)) + ' 个记录'
ENDIF
ENDIF
ENDDO
DO SHOWCOMM WITH '已接收 ' + LTRIM(STR(NTOTREC)) + ' 个记录'
= FCLOSE(NFILE)
USE IN STAFF
USE IN ATTN
USE IN VISITOR
USE IN VISITDAT
DO BACKATTNDAT
RETURN 0
ENDPROC
*------
问题是,怎样把下面的Foxpro程序翻译成Delphi的,急//------------------------Foxpro 源程序--------------------------------
PROCEDURE AppAttn
PRIVATE NFILE , CDATA
PRIVATE NPTR , DDATA
IF .NOT. FILE(CATTNDAT)
RETURN 0
ENDIF
NFILE = FOPEN(CATTNDAT)
IF NFILE = -1
RETURN 54
ENDIF
DO SHOWCOMM WITH '更新员工刷卡资料 ...'
USE IN 0 staff ORDER card_int
USE IN 0 visitor ORDER card_int
USE IN 0 visitdat
USE IN 0 (CDATAPATH + 'attn')
NPTR = 0
DCURR = DATE()
NTOTREC = 0
DO WHILE .NOT. FEOF(NFILE)
CDATA = FREAD(NFILE,10)
M.DATE = INT2DAYSTR(LEFT(CDATA,3)) //取日期
NPTR = NPTR + 10
DDATA = ;
CTOD(SUBSTR(M.DATE,7,2) + '/' + SUBSTR(M.DATE,5,2) + '/' + LEFT(M.DATE,4))
M.TIME = INT2TIMSTR(SUBSTR(CDATA,4,2)) //取时间
M.IO_TYPE = MIN(ASC(SUBSTR(CDATA,6,1)),99) //取出入类型
IF LFULLTENDIG
M.CARD = MIN(VAL(INT2CARD(RIGHT(CDATA,6))),9999999999) //取IC卡号
ELSE
M.CARD = MIN(VAL(INT2CARD(RIGHT(CDATA,4))),9999999999)
ENDIF
M.CARD_NO = STRTRAN(STR(M.CARD,NCARDLG),' ','0')
M.DOOR_NO = NCURRDOOR
M.SITE_NO = NCURRSITE
M.TER_NO = NCURRTER
IF M.IO_TYPE > 100
M.IO_TYPE = MIN(M.IO_TYPE - 100,99)
SELECT VISITOR
SEEK M.CARD
LFND = FOUND()
IF LFND
SCAN REST WHILE M.CARD = VAL(VISITOR.CARD_NO)
IF (DTOS(VISITOR.ADD_DATE) <= M.DATE) AND ;
(EMPTY(VISITOR.EXP_DATE) .OR. DTOS(VISITOR.EXP_DATE) >= M.DATE)
EXIT
ENDIF
ENDSCAN
IF M.CARD <> VAL(VISITOR.CARD_NO)
SKIP -1
ENDIF
ENDIF
IF LFND
M.VISIT_NO = VISITOR.VISIT_NO
SELECT VISITDAT
APPEND BLANK
GATHER MEMVAR
UNLOCK
ENDIF
ELSE
SELECT STAFF
SEEK M.CARD
IF FOUND()
SCAN REST WHILE M.CARD = VAL(STAFF.CARD_NO)
IF EMPTY(STAFF.EXP_DATE) .OR. DTOS(STAFF.EXP_DATE) >= M.DATE
EXIT
ENDIF
ENDSCAN
IF M.CARD <> VAL(STAFF.CARD_NO)
SKIP -1
ENDIF
ENDIF
M.EMP_NO = IIF(FOUND(),STAFF.EMP_NO,'* ' + STRTRAN(STR(M.CARD,NCARDLG),' ','0'))
SELECT ATTN
APPEND BLANK
GATHER MEMVAR
UNLOCK
NTOTREC = NTOTREC + 1
IF MOD(NTOTREC,100) = 0
DO SHOWCOMM WITH '已接收 ' + LTRIM(STR(NTOTREC)) + ' 个记录'
ENDIF
ENDIF
ENDDO
DO SHOWCOMM WITH '已接收 ' + LTRIM(STR(NTOTREC)) + ' 个记录'
= FCLOSE(NFILE)
USE IN STAFF
USE IN ATTN
USE IN VISITOR
USE IN VISITDAT
DO BACKATTNDAT
RETURN 0
ENDPROC
*------
用记录指针就是了
type MyType = record
F1_3: array [1..3] of char;
F4_5: array [1..2] of char;
F6: char;
F7_10: array [1..4] of char;
end;
PMyType=^myType 就是这个http://lysoft.7u7.net