Sửa code file *.prg trong VS FOXPRO (thay số chứng từ) (2 người xem)

  • Thread starter Thread starter sealand
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

sealand

Thành viên gạo cội
Tham gia
16/5/08
Bài viết
4,883
Được thích
7,688
Giới tính
Nam
Nghề nghiệp
Kế Toán
Số là mình sử dung phần mềm Kế toán để nhập chứng từ. Trong quá trình nhập không được lần lượt nên số chứng từ nó cứ loạn lên không theo 1 trật tự nào cả. Nay mình viết 1 file SEALAND.prg để sửa lại số chứng từ trong Table CT.DBF.
Table CT.DBF có chứa 3 field sau: Ma_ct, Ngay_ct, So_ct...
Mình muốn căn cứ ngày chứng từ và loại chứng từ đánh số lại theo trình tự thời gian. Ví dụ PN001, PN002...

Mình viết file SEALAND.prg như sau (Mình lược bỏ chỉ để 1 loại phiếu) không biết sai ở đâu mà không được, mong các bạn biết Foxpro chỉ giùm (Mình thấy các lệnh khác bình thường nhưng lệnh Replace lại không được)

Mã:
SET PATH TO "C:\data2010\"
use ct  ORDER ngay_ct
i=0
j=0
GO top
  SCAN
  j=j+1
   IF ma_ct="PN" then
    i=i+1
    WAIT wind "Sua so PN" +TRANSFORM(i,"@L 999")nowait
    REPLACE So_Ct WITH "PN"+TRANSFORM(i,"@L 999")
    ELSE
    skip  
  ENDIF

ENDSCAN
SET FILTER TO ma_ct='PN'
BROWSE
EXPORT to PHIEUNHAP xls for ma_ct=[PN]
WAIT wind TRANSFORM(j,"@L 999")
USE
RETURN
Xin cám ơn các bạn.
 
Lần chỉnh sửa cuối:
Sealand cho xin file dbf mẫu nha.
 
Sealand chạy thử:

Mã:
SET PATH to "C:\data2010\"
SET DATE FRENCH
USE CT.dbf order ngay_ct
i=0

GO top
  DO WHILE NOT EOF()

   IF ma_ct="PN" then
    i=i+1
*    WAIT wind "Sua so PN" +TRANSFORM(i,"@L 999")nowait
    REPLACE So_Ct WITH "PN"+TRANSFORM(i,"@L 999")
  ENDIF
  SKIP
ENDDO
 
BROWSE FOR ma_ct='PN' nowait
EXPORT to PHIEUNHAP xls for ma_ct=[PN]
WAIT wind TRANSFORM(i,"@L 999")
USE
RETURN
 
Sealand chạy thử:

Mã:
SET PATH to "C:\data2010\"
SET DATE FRENCH
USE CT.dbf order ngay_ct
i=0

GO top
  DO WHILE NOT EOF()

   IF ma_ct="PN" then
    i=i+1
*    WAIT wind "Sua so PN" +TRANSFORM(i,"@L 999")nowait
    REPLACE So_Ct WITH "PN"+TRANSFORM(i,"@L 999")
  ENDIF
  SKIP
ENDDO
 
BROWSE FOR ma_ct='PN' nowait
EXPORT to PHIEUNHAP xls for ma_ct=[PN]
WAIT wind TRANSFORM(i,"@L 999")
USE
RETURN

Em chạy thì báo lỗi dòng Use Ct ...
Em sửa như sau
1/ Modi stru và thêm vào tab indexes ngay_ct
2/ Sửa code lại và thêm dòng pack nhằm bó những dòng đã đánh dấu xóa.
SET PATH to "C:\data2010\"
SET DATE FRENCH
CLOSE ALL
*USE CT order ngay_ct
USE CT
pack
i=0

GO top
DO WHILE NOT EOF()

IF ma_ct="PN" then
i=i+1
* WAIT wind "Sua so PN" +TRANSFORM(i,"@L 999")nowait
REPLACE So_Ct WITH "PN"+TRANSFORM(i,"@L 999")
ENDIF
SKIP
ENDDO

BROWSE FOR ma_ct='PN' nowait
EXPORT to PHIEUNHAP xls for ma_ct=[PN]
WAIT wind TRANSFORM(i,"@L 999")
USE
RETURN
Mà sao anh không export ra ex và thêm soct thì dễ mà, hay là lấy từ file dbf =ado.
Nhưng với bài này, nếu PN có hơn 1 dòng thì kg gán được soPN
 
Lần chỉnh sửa cuối:
1/Nếu anh Mỹ không sắp xếp lại e không ổn vì khi sắp xếp lại nó mới loạn lên. Ví dụ, em đã vào hết các khoản thu chi bình thường rồi, khi sử lý thu tiền hàng từ đầu năm vậy là số ctừ đầu năm này lại lớn hơn số ctừ tháng 12 thu bình thường, trật tự vật lý trong Table vốn đã không tưởng tượng nổi. (Anh hiểu cho, đây là dạng kế toán căn cứ hồ sơ thuế lên sổ sách báo cáo nên có nhiều cái phải làm ngược lắm. Ví dụ thu tiền bán hàng thì chỉ sau khi vào hết ngân hàng mới biết những khoản nào thu dưới 20 triệu bằng tiền mặt, ông chủ đâu có phiếu thu cho kế toán)

2/Cách của Thu Nghi chuyển qua Excel cũng được nhưng nó phải chẻ nhỏ ra. Xuất 1 phát mà nhiều đôi khi nó không nghe. Mặt khác, khi xuất ra và chuyển vào lỗi font chữ khá nhiều nên không khả thi. Mình phải sử lý rất nhiều dạng này nên muốn viết code chạy rẹt 1 cái là nhẹ thân nhất.

3/ Do while.....skip ....enddo và Scan........endscan đều là vòng lặp mà sao cái thì repl được cái thì không? Em kiểm tra biến đếm i thì 2 cái đều như nhau

Mong các anh xem lại giùm.



m
 
Em sửa như sau
1/ Modi stru và thêm vào tab indexes ngay_ct
2/ Sửa code lại và thêm dòng pack nhằm bó những dòng đã đánh dấu xóa.
1. File dbf này nằm trong database (file odb) nên không nên sửa structure. Mình cũng phải sửa mới chạy, vì nó đang chỉ order by stt. Nhưng nếu có sửa thì phải nhớ phục hồi structure lại. Vì khi đưa vào folder hệ thống, nó sẽ tìm cdx không ra.
2. Pack thì làm trong command window 1 lần thôi, bỏ vào code làm gì cho nó chạy hoài.
Nhưng với bài này, nếu PN có hơn 1 dòng thì kg gán được soPN
Đúng vậy! Nêu 1 phiếu nhập 2 mặt hàng trở lên phải thêm điều kiện và trường hợp để code được tổng quát.
 
1/Nếu anh Mỹ không sắp xếp lại e không ổn vì khi sắp xếp lại nó mới loạn lên. Ví dụ, em đã vào hết các khoản thu chi bình thường rồi, khi sử lý thu tiền hàng từ đầu năm vậy là số ctừ đầu năm này lại lớn hơn số ctừ tháng 12 thu bình thường, trật tự vật lý trong Table vốn đã không tưởng tượng nổi. (Anh hiểu cho, đây là dạng kế toán căn cứ hồ sơ thuế lên sổ sách báo cáo nên có nhiều cái phải làm ngược lắm. Ví dụ thu tiền bán hàng thì chỉ sau khi vào hết ngân hàng mới biết những khoản nào thu dưới 20 triệu bằng tiền mặt, ông chủ đâu có phiếu thu cho kế toán)

2/Cách của Thu Nghi chuyển qua Excel cũng được nhưng nó phải chẻ nhỏ ra. Xuất 1 phát mà nhiều đôi khi nó không nghe. Mặt khác, khi xuất ra và chuyển vào lỗi font chữ khá nhiều nên không khả thi. Mình phải sử lý rất nhiều dạng này nên muốn viết code chạy rẹt 1 cái là nhẹ thân nhất.

3/ Do while.....skip ....enddo và Scan........endscan đều là vòng lặp mà sao cái thì repl được cái thì không? Em kiểm tra biến đếm i thì 2 cái đều như nhau

Mong các anh xem lại giùm.

1. Như đã nói bài trên (viết xong bài trên mới thấy bài sealand), tôi có modify structure rồi mới chạy code: index on ngay_ct trước, rồi mới tới index on STT. Nhờ vậy mới thấy cái hổ lốn của chứng từ (hì hì): ngày đảo lộn, số chứng từ cũ cũng lộn tùng phèo. Còn sau đó trước khi đưa vào hệ thống, phải phục hồi structure cho nó.
2. Xuất ra Excel cũng không khó, Sealand nghiên cứu cấu trúc export to abc xls For ma_ct = 'PN' and / or ... mà làm tới. Sau khi xử lý bằng Excel, thì không lưu bình thường mà lưu dạng Excel 5, sẽ import dễ dàng, và không lỗi font. Giả sử export ra mỗi ma_ct là 1 file Excel thì sau khi xử lý, gộp lại thành 1 sheet trong 1 file.
3. Tôi kiểm tra biến đếm i và j đều khác nhau:
- File có 823 record, code của sealand chỉ đếm 440
- Có 85 record có ma_ct là 'PN', nhưng code sealand chỉ đếm 56.

Có lẽ do câu lệnh Skip để trong If
 
À! Thì ra anh làm bằng tay cái đoạn sắp xếp. Có lý anh ạ. Nhưng nếu đưa vào code được thì tốt chứ làm bằng tay thì mỗi data nó có khoảng 4 file dạng này. Giờ làm thì nhớ kỳ sau làm lại phải nghiên cứu lại anh ạ. Đây là các file tổng hợp nên nó chỉ có mỗi chứng từ 1 dòng thôi.
Hì, Em chép phải đoạn code lỗi rồi. Trong scan không cần skip nó cũng nhảy. Em làm không được nên mầy mò cho vào thôi.
 
Lần chỉnh sửa cuối:
Sealand xem code này làm 1 lần cho hết các loại mã, chỉ cần khai báo các ma_ct vào 1 Array:

Mã:
SET PATH TO "E:\"
SET DATE FRENCH
DIMENSION MaCT(4) as Character
   Mact(1)= 'PN'
   Mact(2)= 'PX'
   Mact(3)= 'PT'
   Mact(4)= 'PC'
   iCT = 1
USE CT.dbf order ngay_ct
FOR iCT = 1 TO 4 
  i=0
  j=0
  GO top
  DO WHILE NOT EOF()
    j=j+1
     IF ma_ct = Mact(iCT) then
        i=i+1
        REPLACE So_Ct WITH Ma_CT + TRANSFORM(i,"@L 999")
     ENDIF
     SKIP
   ENDDO
   ? STR(j) + ", " + STR(i)
ENDFOR

USE
RETURN
Hinh như PK thì số chứng từ lại là PKTxxx, HD thì là số HD 7 số. Các trường hợp này phải làm riêng.

Câu lệnh ? STR(j) + ", " + STR(i) là để kiểm tra biến đếm j và i ngay trên màn hình.

Còn vụ modify Structure thì vầy:

Chỉ làm 1 lần. Fox sẽ tạo 1 file cdx vào thư mục đã set path. Lần sau đưa file gốc vào nó sẽ tự tìm cdx để sort, khỏi làm lần 2.
 
Xin lỗi anh không nói rõ, riêng hoá đơn thì không sửa vì nó chính là số của Hoá đơn tài chính.
Có lẽ phải tối mới test được, giờ phải họp mất rồi.
Cám ơn anh và em sẽ thông báo kết quả sau.
 
Cám ơn các anh, bài này muốn thông báo các anh biết kết quả.
Với yêu cầu ban đầu như vậy đã rõ ràng và kết quả hoàn toàn mỹ mãn. Mình cũng xin nói thêm từ đây mình sẽ cố gắng hoàn thiện để đạt mô hình như sau:

-Tạo chương trình Điều chỉnh số chứng từ độc lập.
-Cấp đường dẫn và thư mục Data cần điều chỉnh.
-Tạo thư mục Tmp để chép các file cần điều chỉnh vào.
-Tạo các tệp chỉ mục theo ngay_ct.
-Điều chỉnh.
-Hoàn chỉ mục Stt thep nguyên gốc.
-Chép trả về data và xoá thư mục Tmp.

Như vậy chắc các công việc sẽ dễ thao tác hơn nhiều.
Để thực hiện được chắc còn nhiều vướng mắc, mong các anh trợ giúp thêm.
Cám ơn các anh rất nhiều.
 
Như thế này cho khoẻ Sealand nè:

- Chép table từ Data vào Tmp, chép luôn file chỉ mục cdx thí dụ CTgoc.cdx
- Modify Structure, index theo ngay_ct, để Fox tạo 1 file Index thứ 2,
- Đóng table
- Sửa tên cdx mới tạo thành CT2.cdx

Sau đó trong chương trình (prg), dùng 2 câu lệnh ở đầu và cuối:

SET INDEX TO CT2.CDX
.....
SET INDEX TO CTgoc.CDX

Nếu làm như vậy thì sau đó đừng xoá tmp
 
trong phần mềm kế toán fast 10.2 có chức năng tự động đánh số chứng từ, anh biết vfp có thể tham khảo cod đó của fast
 
Hòi queluatb, vậy source code là mã nguồn mở hả. Hay thật.
Topic từ đời nào giờ mới tư vấn hay là quảng cáo phần mềm nhỉ?
 
Cám ơn các anh, bài này muốn thông báo các anh biết kết quả.
Với yêu cầu ban đầu như vậy đã rõ ràng và kết quả hoàn toàn mỹ mãn. Mình cũng xin nói thêm từ đây mình sẽ cố gắng hoàn thiện để đạt mô hình như sau:

-Tạo chương trình Điều chỉnh số chứng từ độc lập.
-Cấp đường dẫn và thư mục Data cần điều chỉnh.
-Tạo thư mục Tmp để chép các file cần điều chỉnh vào.
-Tạo các tệp chỉ mục theo ngay_ct.
-Điều chỉnh.
-Hoàn chỉ mục Stt thep nguyên gốc.
-Chép trả về data và xoá thư mục Tmp.

Như vậy chắc các công việc sẽ dễ thao tác hơn nhiều.
Để thực hiện được chắc còn nhiều vướng mắc, mong các anh trợ giúp thêm.
Cám ơn các anh rất nhiều.

mình mới xem đề tài của bạn, thử đoạn code này xem
SET SAFETY OFF
USE chungtu
INDEX on ma_ct+DTOC(ngay_ct) TO index_1
luuma=
[*]
luungay={}
so=0
SCAN
IF luuma#ma_ct
so=1
luuma=ma_ct
ENDIF
IF luungay#ngay_ct
so=1
luungay=ngay_ct
ENDIF
REPLACE so_ct WITH TRANSFORM(so,[@l 999])
so=so+1
ENDSCAN

BROWSE FONT [vni-times],14
CLOSE INDEXES
ERASE *.idx
SET SAFETY ON
 
Web KT

Bài viết mới nhất

Back
Top Bottom