PDA

View Full Version : [dis] Câu lạc bộ Visual Foxpro Hấp dẫn nhất từ trước đến nay !!!!!!



Pages : 1 2 3 4 5 [6] 7 8 9

tungvv
11-02-2011, 10:39
To : Character; vanvietkhoa
cám ơn các bạn đã giúp đỡ. Tìm kiếm mãi rồi cũng mò ra nguyên nhân do cái PM vi rút KIS2010 nó nhận diện file khởi động startup.exe có chứa các hành động nguy hiểm nên nó chặn không cho truy cập một số database. Giải pháp đơn giản là đưa nó vào loại ứng dụng tin tưởng trong PM virut. sử dụng PM vi ruts nhiều phiền toái quá, mà ko dùng thì ko được.

sweetboy2805
11-02-2011, 13:30
Ý của bạn là hay đấy …, từ trước tôi cũng có nhu cầu, cố lục lọi tìm cách in trực tiếp biểu đồ dạng Column, Pie … từ form xuất ra Report hoặc in ra giấy, nhưng không làm được. Theo tôi thì giải pháp dùng lệnh VFP in Form ra giấy là không đơn giản. Trong khi chờ đợi các cao thủ tư vấn, giúp bạn, tôi có thiển ý, nếu bạn đã dùng VFP chuyển dữ liệu thành dạng biểu đồ (Excel), bạn tạo thêm nút lệnh in trên form, trong biến cố Click của nút In này, bạn viết code chèn (insert) biểu đồ đó ra file Word nào đó (thay cho xuất ra Report), sau đó dùng VFP gọi file Word này --> in ra giấy.

Chào bạn
Character

Thật ra thì mình đã áp dụng 1 giải pháp khá hiệu quả rồi. Đó là mình có viết một đoạn code khi muốn in thì bấm nút, chương trình sẽ tự động bật file excel có biểu đồ cần in luôn, tóm lại là nhúng biểu đổ trên form fox để xem thôi, còn in thì in qua excel.

Nhưng chương trình mình viết là để cho nhân viên làm số liệu dưới nhà máy người ta sử dụng. Nhiều khi vừa bật fox, vừa bật excel lung tung, người ta cũng dễ bị rối. Tạm thời thì mình cũng ko có cách nào khá khẩm hơn cả.

PS : Không biết có cao thủ nào đã nghiên cứu qua vấn đề in biểu đồ trong fox chưa nhỉ, rất mong tìm được các bạn có cùng vướng mắc để anh em ta chia sẻ kinh nghiệm.

hoangnnm
11-02-2011, 14:41
Ở vfp 9 đã có hỗ trợ chart trong report . Bạn có thể tìm thấy ví dụ trong phần sample sau khi cài đặt vfp9 .
Còn không thì như mình đã nói ở trên , bạn có thể chụp hình form để in ra như là in 1 file bmp . Đương nhiên là in = lập trình chứ không phải thủ công .
Link tham khảo : http://www.foxite.com/downloads/default.aspx?id=12&keyword=buildbmp.zip&category=

luu_luu
14-02-2011, 08:06
Chào các bạn! Cho mình hỏi đã có bạn nào làm ứng dụng lấy dữ liệu từ các tệp excel theo cấu trúc, tệp excel có phần header và phần Data. Đầu tiên là phần header sau đó là phần Data. Phần Data bắt đầu từ dòng thứ 5 chẳng hạn. Mình định làm theo kiểu như sau, tạo 1 Object Excel rồi sau đó mở tệp dữ liệu, copy sang 1 tệp khác, xóa các dòng header đi sau đó save as thành dạng dbf. Không biết có cách nào khác nữa không nhỉ. Không sử dụng DBO vì nó loằng ngoằng lắm.

bạn dùng thử cái này xem
**************************
PARAMETERS tenexcel

* nho duong dan day du

* DO EXCEL2DBF WITH [C:\PATH\PATH\TENFILE] chi can ten tap tin khong can phan mo rong

SET SAFETY OFF

IMPORT from &tenexcel type XL8

USE &tenexcel

* phan nay ban thay doi theo nhu cau cua ban

ALTER table ALIAS() alte COLUMN a c(7)

ALTER table ALIAS() alte COLUMN b c(12)

ALTER table ALIAS() alte COLUMN c c(12)

ALTER table ALIAS() alte COLUMN d y

SELECT a as stt,b as tkno,c as tkco,d as tien FROM ALIAS() INTO CURSOR SYS(2015)

* phan nay ban thay doi theo nhu cau cua ban



BROWSE

SET SAFETY ON

robotfpt
14-02-2011, 11:29
Thử cách này xem
Tạo nút Export file biểu đồ ra file ảnh (hoặc khi nhấn In thì export), chẳng hạn Chart.bmp
Trong report, chèn object vào rồi chỉ đường dẫn đến file Chart.bmp

Character
14-02-2011, 12:35
Gửi bạn Robotfpt

Tôi có viết đoạn Code chuyển dữ liệu VFP ra dạng biểu đồ (Chart) xuất lên Form, Excel, Word, tuy nhiên không thể xuất ra Report. Nay Bạn có gợi ý thêm một cách nữa là xuất biểu đồ ra dạng file hình ảnh (*.bmp …). Sẵn lòng Bạn có thể giúp luôn đoạn code xuất biểu đồ (Chart) ra file hình ảnh được không ? (Sau khi có file hình ảnh thì việc đưa vào Report là đơn giản). Cám ơn bạn trước.

Gửi bạn Luu_luu

1-Trong phần trả lời cuả bạn với bạn Darshana, Tôi thấy bạn có dòng lệnh:

IMPORT from &tenexcel type XL8

Nay nhờ bạn giải thích thêm ý nghĩa khi nào ta dùng (cho mỗi trường hợp) XL5 / XLS / XL8.

2- Tôi muốn tô đen tất các hàng kẻ ngang (hoặc dọc) trong bảng Excel thì trong VFP dùng các dòng lệnh gì ?
(VD: oExcel.Selection.Borders(10).LineStyle = 1)
………….

Mong các bạn giúp. Cám ơn.

Newbie.vfp
14-02-2011, 13:11
Chào mọi người, em đang tập làm 1 game đoán chữ gần giống như game "chiếc nón kì diệu". Em muốn sau khi đoán xong ô chữ thứ nhất thì chương trình sẽ tự động chuyển sang câu hỏi của ô chữ thứ 2, em mò mãi mà ko ra. Mong mọi người giúp em với. Xin cám ơn!

robotfpt
14-02-2011, 13:21
Gửi bạn Robotfpt

Tôi có viết đoạn Code chuyển dữ liệu VFP ra dạng biểu đồ (Chart) xuất lên Form, Excel, Word, tuy nhiên không thể xuất ra Report. Nay Bạn có gợi ý thêm một cách nữa là xuất biểu đồ ra dạng file hình ảnh (*.bmp …). Sẵn lòng Bạn có thể giúp luôn đoạn code xuất biểu đồ (Chart) ra file hình ảnh được không ? (Sau khi có file hình ảnh thì việc đưa vào Report là đơn giản). Cám ơn bạn trước.



Kiểm tra đối tượng (Chart) trên form có thuộc tính ExportPicture (hay đại loại thế)để export

Character
14-02-2011, 15:40
Kiểm tra đối tượng (Chart) trên form có thuộc tính ExportPicture (hay đại loại thế)để export

Cám ơn bạn có gợi ý, tôi sẽ tìm hiểu thêm giải pháp của bạn và của cả bạn Hoangnnm (Dùng chương trình chụp đối tượng điều khiển trong Form xuất ra file hình ảnh).

Chào bạn
Character

luu_luu
15-02-2011, 08:12
Gửi bạn Robotfpt

Tôi có viết đoạn Code chuyển dữ liệu VFP ra dạng biểu đồ (Chart) xuất lên Form, Excel, Word, tuy nhiên không thể xuất ra Report. Nay Bạn có gợi ý thêm một cách nữa là xuất biểu đồ ra dạng file hình ảnh (*.bmp …). Sẵn lòng Bạn có thể giúp luôn đoạn code xuất biểu đồ (Chart) ra file hình ảnh được không ? (Sau khi có file hình ảnh thì việc đưa vào Report là đơn giản). Cám ơn bạn trước.

Gửi bạn Luu_luu

1-Trong phần trả lời cuả bạn với bạn Darshana, Tôi thấy bạn có dòng lệnh:

IMPORT from &tenexcel type XL8

Nay nhờ bạn giải thích thêm ý nghĩa khi nào ta dùng (cho mỗi trường hợp) XL5 / XLS / XL8.

2- Tôi muốn tô đen tất các hàng kẻ ngang (hoặc dọc) trong bảng Excel thì trong VFP dùng các dòng lệnh gì ?
(VD: oExcel.Selection.Borders(10).LineStyle = 1)
Mong các bạn giúp. Cám ơn.
………….
1.
XLS thì dùng cho version 2.0, 3.0, 4.0
XL5 = 5.0
XL8 excel 97 trở lên.
2. hì hì,mình chưa nghiên cứu tới, xin lỗi.

tungvv
16-02-2011, 08:31
Xin các anh em chỉ giúp : Để in 1 xâu ký tự đã biết trước (VD "123456789") nhưng cho phép chèn giữa các ký tự đó các khoảng trắng thì viết lệnh như thế nào cho nhanh và gọn ( để có kết quả như "1 2 3 4...").
Xin cảm ơn!

Character
16-02-2011, 13:48
Xin các anh em chỉ giúp : Để in 1 xâu ký tự đã biết trước (VD "123456789") nhưng cho phép chèn giữa các ký tự đó các khoảng trắng thì viết lệnh như thế nào cho nhanh và gọn ( để có kết quả như "1 2 3 4...").
Xin cảm ơn!

Gửi bạn Tungvv
Bạn dùng thử đoạn code này nhé

*-----------------
xaukytu='123456789'
x=3
nXau=LEN(Allt(xaukytu))
xaukytu=Allt(STUFF(xaukytu,2,0,' '))
FOR i=1 TO nXau
xaukytu=STUFF(xaukytu,i+x,0,' ')
x=x+1
Endf
*-----------------

Chào bạn Luu_luu

Cám ơn lời giải thích của bạn về XLS / XL5 / XL8
Vấn đề còn lại tôi tự tìm hiểu thêm

Chào thân ái.
Character

tungvv
17-02-2011, 08:11
Gửi bạn Tungvv
Bạn dùng thử đoạn code này nhé
*-----------------
xaukytu='123456789'
x=3
nXau=LEN(Allt(xaukytu))
xaukytu=Allt(STUFF(xaukytu,2,0,' '))
FOR i=1 TO nXau
xaukytu=STUFF(xaukytu,i+x,0,' ')
x=x+1
Endf
*-----------------
Character

Cám ơn bạn nhiều, đã dùng đc rồi, nhưng nếu muốn thêm nhiều hơn các khoảng trắng nữa thì làm như thế nào bạn ?. Mình đã thử điều chỉnh các thông số trong câu lệnh nhưng kq là các khoảng trắng ko bằng nhau.
xem lại tý giúp mình với nhé. Cám ơn !

Character
17-02-2011, 10:07
Cám ơn bạn nhiều, đã dùng đc rồi, nhưng nếu muốn thêm nhiều hơn các khoảng trắng nữa thì làm như thế nào bạn ?. Mình đã thử điều chỉnh các thông số trong câu lệnh nhưng kq là các khoảng trắng ko bằng nhau.
xem lại tý giúp mình với nhé. Cám ơn !


Gửi bạn Tungvv

Bạn dùng thử đoạn Code này nhé

*--------------------------------------------
xaukytu='Character tra loi Tungvv ve chen them tu 1 den nhieu khoang trang giua cac ky tu'
nXau=LEN(Allt(xaukytu))
x=1
nkhoangtrang=2 && nếu số khoảng trắng cần chèn (giữa các ký tự) là 2, (hoặc nếu cần chèn nhiều khoảng trắng hơn nữa thì tăng số 2 này lên thành 3, hoặc 4, hoặc 5 …)
xaukytu=Allt(STUFF(xaukytu,LEN(Allt(xaukytu)),0,SP ACE(nkhoangtrang)))
FOR i=1 TO nXau-2
xaukytu=STUFF(xaukytu,LEN(Allt(xaukytu))-(nkhoangtrang*i)-x,0,SPACE(nkhoangtrang))
x=x+1
Endf
*--------------------------------------------

Nếu chưa đúng ý của bạn thì cho tôi biết nhé.
Chúc bạn thành công. Chào bạn

Character

hoangnnm
17-02-2011, 10:19
Cám ơn bạn nhiều, đã dùng đc rồi, nhưng nếu muốn thêm nhiều hơn các khoảng trắng nữa thì làm như thế nào bạn ?. Mình đã thử điều chỉnh các thông số trong câu lệnh nhưng kq là các khoảng trắng ko bằng nhau.
xem lại tý giúp mình với nhé. Cám ơn !

Về kết quả thì như nhau , nhưng mình nghĩ thế này có vẻ dễ hiểu hơn chút .


private m.x, m.i , m.khoang , m.kq
m.x = [abcxyz] &&& chuoi truyen vao
m.kq = [] && ket qua
m.khoang = 3 && Space

m.x = alltrim(m.x)
For i = 1 to len( m.x )
m.kq = m.kq + Substr(m.x,i,1) + iif( i = len(m.x) , [], space(m.khoang) )
Endfor
wait wind m.kq

robotfpt
17-02-2011, 10:35
Thêm cách nữa:
ch = "123456789"
_len = LEN(ch)
_kt = " "
i = 2

DO WHILE i<=_len
ch = STUFF(ch,i,0,_kt)
_len = LEN(ch)
i = i + 2
ENDDO

MESSAGEBOX(ch)

tungvv
17-02-2011, 10:53
Gửi bạn Tungvv

xaukytu='Character tra loi Tungvv ve chen them tu 1 den nhieu khoang trang giua cac ky tu'
nXau=LEN(Allt(xaukytu))
x=1
nkhoangtrang=2 && nếu số khoảng trắng cần chèn (giữa các ký tự) là 2, (hoặc nếu cần chèn nhiều khoảng trắng hơn nữa thì tăng số 2 này lên thành 3, hoặc 4, hoặc 5 …)
xaukytu=Allt(STUFF(xaukytu,LEN(Allt(xaukytu)),0,SP ACE(nkhoangtrang)))
FOR i=1 TO nXau-2
xaukytu=STUFF(xaukytu,LEN(Allt(xaukytu))-(nkhoangtrang*i)-x,0,SPACE(nkhoangtrang))
x=x+1
Endf

Đã dùng OK, cám ơn Character nhiều nhé !
*---------------------------------
To @hoangnnm
Phần của bạn HD cũng dể hiểu và dùng OK.
Nói tóm lại mình cần một thủ tục để điều chỉnh độ rộng của Txt in ra phù hợp với hóa đơn bán hàng đã in sẵn. Vậy đã tốt rồi.
Xin cám ơn các bạn !

luu_luu
17-02-2011, 10:58
xem code này :
a=[123456789]
b=[]
c=1 && biến này thay đổi được
for i=1 to LEN(ALLT(a))
b=b+subs(a,i,1)+spac(c)
endfo

thayphapag
18-02-2011, 14:14
Chào các Bác, Mong các Bác giúp dùm
Mình muốn thiết kế chương trình Quản lý thi cho nhiều kỳ thi, mỗi kỳ thi khi khai báo: mã kỳ thi xong chương trình sẽ tự tạo 1 thư mục mang tên mã kỳ thi, trong thư mục này sẽ chứa các file .DBF của 1 kỳ thi. Nay nhờ các bác giúp dùm sử dụng lệnh như thế nào để khi khai báo mã kỳ thi thì chương trình sẽ tự tạo thư mục với tên thư mục là mã kỳ thi vừa khai báo, trong thư mục sẽ chứa các file .DBF của 1 kỳ thi (Các file này đực tạo trước lưu trong thư mục của chương trình). Khi chọn thư mục cho kỳ thi nào thì chương trình tự đọc các file .DBF trong thư mục của kỳ thi đó. Mong các bác giúp dùm. Trân trọng.

hoangnnm
18-02-2011, 15:23
Chào các Bác, Mong các Bác giúp dùm
Mình muốn thiết kế chương trình Quản lý thi cho nhiều kỳ thi, mỗi kỳ thi khi khai báo: mã kỳ thi xong chương trình sẽ tự tạo 1 thư mục mang tên mã kỳ thi, trong thư mục này sẽ chứa các file .DBF của 1 kỳ thi. Nay nhờ các bác giúp dùm sử dụng lệnh như thế nào để khi khai báo mã kỳ thi thì chương trình sẽ tự tạo thư mục với tên thư mục là mã kỳ thi vừa khai báo, trong thư mục sẽ chứa các file .DBF của 1 kỳ thi (Các file này đực tạo trước lưu trong thư mục của chương trình). Khi chọn thư mục cho kỳ thi nào thì chương trình tự đọc các file .DBF trong thư mục của kỳ thi đó. Mong các bác giúp dùm. Trân trọng.

Tạo thư mục thì bạn dùng lệnh MKDIR() .
Để copy file thì dùng lệnh copy , hoặc có rất nhiều cách để copy .
Bạn nên đọc thêm ở file help của fox9 .

Fish eye
18-02-2011, 16:57
Chào các Bác, Mong các Bác giúp dùm
Mình muốn thiết kế chương trình Quản lý thi cho nhiều kỳ thi, mỗi kỳ thi khi khai báo: mã kỳ thi xong chương trình sẽ tự tạo 1 thư mục mang tên mã kỳ thi, trong thư mục này sẽ chứa các file .DBF của 1 kỳ thi. Nay nhờ các bác giúp dùm sử dụng lệnh như thế nào để khi khai báo mã kỳ thi thì chương trình sẽ tự tạo thư mục với tên thư mục là mã kỳ thi vừa khai báo, trong thư mục sẽ chứa các file .DBF của 1 kỳ thi (Các file này đựơc tạo trước lưu trong thư mục của chương trình). Khi chọn thư mục cho kỳ thi nào thì chương trình tự đọc các file .DBF trong thư mục của kỳ thi đó. Mong các bác giúp dùm. Trân trọng.

Yêu cầu cuả bạn liên quan nhiều vấn đề (có nhiều cách để thực hiện). Dưới đây là các đoạn Code ví dụ mang tính gợi ý, hướng dẫn có liên quan đến câu hỏi của bạn, trích từ một chương trình tương tự đang dùng, có chỉnh sửa lại theo ý bạn, gửi bạn tham khảo.

1.Tạo thư mục mới có tên MAKYTHI1 (MAKYTHI2, MAKYTHI3 …) tại thư mục hiện hành, thư mục này có chứa toàn bộ file dữ liệu cần thiết (copy từ thư mục DATA có chứa các file dữ liệu mẫu định trước, ví dụ bao gồm các file *.dbc, *.dct, *.dcx, *.dbf, *.cdx, *.fpt … nếu có)

cSource=Full('')+'DATA\*.*' && ví dụ thư mục nguồn DATA (có sẵn) tại thư mục hiện hành
cMAKYTHI=Full('')+'MAKYTHI1\' && MAKYTHI1, MAKYTHI2, MAKYTHI3 … là ví dụ tên thư mục mới tự đặt

If DIRECTORY(cMAKYTHI)=.F.
MKDIR (cMAKYTHI)
Copy FILE(cSource) to (cMAKYTHI+'*.*')
Else
If Messagebox(' Thu muc da ton tai. Ghi de (Y/N) ? ',292,'Xac nhan')=6 then
Copy FILE(cSource) to (cMAKYTHI+'*.*')
Endi
Endi

2.Khi chọn thư mục cho kỳ thi nào thì chương trình tự truy cập cơ sở dữ liệu (nếu có) trong thư mục kỳ thi đó:

Bạn tạo form và tạo 01 điều khiển Combobox (có thể thêm nút lệnh OK) .
a.Viết mã code cho Procedure Init của Combobox:

This.AddItem('Ky thi 1')
This.AddItem('Ky thi 2')
This.AddItem('Ky thi 3')

(… Tiếp tục nếu có …)

b.Viết code cho Procedure Valid của Combobox (hoặc tại Procedure Click của nút lệnh OK):

Do case
Case Thisform.Combobox.Value='Ky thi 1'
Thumucdulieu='MAKYTHI1\'
Case Thisform.Combobox.Value='Ky thi 2'
Thumucdulieu='MAKYTHI2\'
Case Thisform.Combobox.Value='Ky thi 3'
Thumucdulieu='MAKYTHI3\'
……………
Endc

Open Database (Full('')+Thumucdulieu+'csdl.dbc')
Set Database to (Full('')+Thumucdulieu +'csdl.dbc')

*Chương trình chọn cơ sở dữ liệu này làm cơ sở dữ liệu hiện hành (nếu có csdl.dbc - tên cơ sở dữ liệu chứa trong thư mục mã kỳ thi khi bạn chọn tại Combobox)

Hy vọng có thể giúp bạn được chút ít.

Chào bạn

Fish eye.

thayphapag
18-02-2011, 21:24
Chân thành cảm ơn bạn hoangnnm và Fish eye rất nhiều, mình sẽ tiếp tục nghiên cứu để thực hiện.

To Fish eye:
Mình xin hỏi thêm tí, giả sử chương trình mình xây dựng không có file .dbc mà chỉ có các free table được đặt trong 1 thư mục thì câu lệnh Opendatabase có thực hiện được không hay có cách nào khác. Cảm ơn bạn trước!

Fish eye
18-02-2011, 22:33
Chân thành cảm ơn bạn hoangnnm và Fish eye rất nhiều, mình sẽ tiếp tục nghiên cứu để thực hiện.

To Fish eye:
Mình xin hỏi thêm tí, giả sử chương trình mình xây dựng không có file .dbc mà chỉ có các free table được đặt trong 1 thư mục thì câu lệnh Opendatabase có thực hiện được không hay có cách nào khác. Cảm ơn bạn trước!

Chào Thayphapag

Trường hợp Bạn không tạo cơ sở dữ liệu (Database) mà dùng các bảng tự do (free table) thì bỏ 02 dòng lệnh:

Open Database (Full('')+Thumucdulieu+'csdl.dbc')
Set Database to (Full('')+Thumucdulieu +'csdl.dbc')

Tuy nhiên quá trình thiết lập các form hoặc viết Code phải lưu ý là:
Khi chương trình thi hành, lúc người dùng chuyển qua thư mục khác (do không thiết kế Database), có thể dẫn đến sự nhầm lẫn của chương trình là các form (hoặc lệnh Use <bảng table>) nhận diện không đúng bảng table của thư mục mới cần sử dụng (tránh nhận nhầm bảng table trong thư mục cũ hoặc không chuyển đổi bảng table trong thư mục tại thời điểm thiết kế).

Remove các bảng Table (nếu có) trong Data Enviroment của Form, thay vào đó tại Procedure Load của các Form phài có dòng lệnh gọi bảng Table của thư mục mới cần sử dụng, ví dụ:

Use (Full('')+Thumucdulieu +'Table1.dbf') && Thumucdulieu là biến chung (Public)

Bạn có thể trao đổi thêm nếu có vấn đề gì chưa rõ.

Chào
Fish eye

thanhchi89
19-02-2011, 07:06
Chao cac Pro. chi dum em sao em thuc hien cap nhat. bat dau khi cap nhat thi em cho kiem tra xem masv co o trong table sinh vien khong neu co thi em kiem tra tiep no da cap nhat chua con neu khong thi bao khong tim thay. Nhung khi cap nhat no khong kiem tra dau tien duoc la da cap nhat roi ma no cu cap nhat. cac bac giup dum. Day la code cua em.
WITH thisform
SELECT 1

te=.text1.Value
ho=.text2.value
*ngv=thisform.daY1.Value
LOCATE FOR te=sinhvien.masv
IF FOUND() THEN
SELECT 2
IF (THISFORM.TExt1.Value )=VAY.MASV
*IF FOUND() THEN
MESSAGEBOX(" BAN DA THEM ROI")

RETURN


*LOCATE FOR THISFORM.TExt1.Value =VAY.MASV

ELSE

te=.text1.Value

.text2.Value=sinhvien.hoten
ho=.text2.value


INSERT INTO vay(masv, hoten) VALUES (te, ho)

MESSAGEBOX(" thay ")


ENDIF


else

.text1.Value=""

MESSAGEBOX(" khong")
ENDIF


thisform.Refresh
endwith

Fish eye
19-02-2011, 08:24
[QUOTE=thanhchi89;2547080]Chao cac Pro. chi dum em sao em thuc hien cap nhat. bat dau khi cap nhat thi em cho kiem tra xem masv co o trong table sinh vien khong neu co thi em kiem tra tiep no da cap nhat chua con neu khong thi bao khong tim thay. Nhung khi cap nhat no khong kiem tra dau tien duoc la da cap nhat roi ma no cu cap nhat. cac bac giup dum.


Bạn thay thử đoạn code của bạn đã trình bày bằng đoạn Code sau:

*------------
WITH thisform
SELECT 1
te=Allt(Lower(.text1.Value))
ho=Allt(Lower(.text2.value))
LOCATE FOR te=Allt(Lower(sinhvien.masv))
IF FOUND() THEN
SELECT 2
If te=Allt(Lower(VAY.MASV))
MESSAGEBOX(" BAN DA THEM ROI")
RETURN
ELSE
If MESSAGEBOX(" Cap nhat ma SV, Ho ten SV (Y/N) ? ",292,'Xac nhan')=6 then
INSERT INTO vay(masv, hoten) VALUES (.text1.Value, .text2.value)
MESSAGEBOX(" Da cap nhat. ")
Endi
ENDIF
Else
MESSAGEBOX(" Khong ton tai ma SV " +Allt(.text1.Value))
.text1.Value=""
ENDIF
Thisform.Refresh
Endwith
*------------

Nếu chưa đúng ý chỗ nào thì bạn cho biết thật cụ thể nhé!

Chào
Fish eye

gianglangtukg
22-02-2011, 09:16
Em đang làm bài về vfp, các pro cho em hỏi, cách tạo báo cáo về hàng tồn kho, tồn theo tháng,....

tamhoat
22-02-2011, 13:53
Xin chào ACE,
cho mình hỏi muốn lấy tên của alia đang mở hiện thời thì dùng lệnh gì ?

Character
22-02-2011, 14:12
Xin chào ACE,
cho mình hỏi muốn lấy tên của alia đang mở hiện thời thì dùng lệnh gì ?

Bạn dùng thử hàm này xem
?ALIAS()

luu_luu
23-02-2011, 07:35
Bạn dùng thử hàm này xem
?ALIAS()

tt_1=alia()


sele (tt_1)

Newbie.vfp
23-02-2011, 09:48
Chào mọi người,em đang tạo 1 command "XOA" nhờ cac bro xem giúp em đoạn code em viết co đúng hay ko mà sao em sử dụng không được:

#define messagebox_Yes 6
#define c_messagebox1 36
#define c_thongbao"Xoa record nay?"

IF MESSAGEBOX(C_thongbao,c_messagebox1,"Chu y") = messagebox_yes
DELETE
IF !EOF()
SKIP 1
IF EOF()
GO BOTTOM
ELSE
SKIP 1
IF EOF()
GO BOTTOM
ELSE
SKIP -1
ENDIF
ENDIF
ENDIF
thisformset.Refresh
ENDIF

luu_luu
23-02-2011, 10:15
Chào mọi người,em đang tạo 1 command "XOA" nhờ cac bro xem giúp em đoạn code em viết co đúng hay ko mà sao em sử dụng không được:

#define messagebox_Yes 6
#define c_messagebox1 36
#define c_thongbao"Xoa record nay?"

IF MESSAGEBOX(C_thongbao,c_messagebox1,"Chu y") = messagebox_yes
DELETE
IF !EOF()
SKIP 1
IF EOF()
GO BOTTOM
ELSE
SKIP 1
IF EOF()
GO BOTTOM
ELSE
SKIP -1
ENDIF
ENDIF
ENDIF
thisformset.Refresh
ENDIF

nếu bạn muốn mỗi lần CLICK thì xóa REC hiện hành thì làm gọn code của bạn theo cách này:
IF MESSAGEBOX(C_thongbao,c_messagebox1,"Chu y") = messagebox_yes
DELETE && đánh dấu xóa
PACK && xóa hẳn
thisformset.Refresh
ENDIF
lệnh DELETE chỉ đánh dấu xóa 1 REC, muốn xóa hẳn REC đó thì phát lệnh PACK theo sau.

Newbie.vfp
23-02-2011, 11:00
nếu bạn muốn mỗi lần CLICK thì xóa REC hiện hành thì làm gọn code của bạn theo cách này:
IF MESSAGEBOX(C_thongbao,c_messagebox1,"Chu y") = messagebox_yes
DELETE && đánh dấu xóa
PACK && xóa hẳn
thisformset.Refresh
ENDIF
lệnh DELETE chỉ đánh dấu xóa 1 REC, muốn xóa hẳn REC đó thì phát lệnh PACK theo sau.

Nó báo là "you must be opened exclusively" anh ơi

Character
23-02-2011, 12:02
Chào mọi người,em đang tạo 1 command "XOA" nhờ cac bro xem giúp em đoạn code em viết co đúng hay ko mà sao em sử dụng không được:

#define messagebox_Yes 6
#define c_messagebox1 36
#define c_thongbao"Xoa record nay?"

IF MESSAGEBOX(C_thongbao,c_messagebox1,"Chu y") = messagebox_yes
DELETE
IF !EOF()
SKIP 1
IF EOF()
GO BOTTOM
ELSE
SKIP 1
IF EOF()
GO BOTTOM
ELSE
SKIP -1
ENDIF
ENDIF
ENDIF
thisformset.Refresh
ENDIF

Đoạn Code của bạn viết đúng rồi (khá cẩn thận đấy), tuy nhiên bạn cần nói rõ hơn “… sử dụng không được …” là như thế nào, biểu hiện chương trình ra sao, câu báo lỗi … thì mọi người tư vấn giúp bạn chỉnh sửa đúng ý, sử dụng được ngay.

Với mô tả ngắn gọn của bạn, Tôi chỉ có thể gợi ý thêm như thế này:

Để Xoá một record trong bảng Table (Ví dụ Table1.dbf) thì nên lưu ý thêm có các lệnh như sau:
- Set delete OFF/ON && hiển thị/không hiển thị record bị đánh dấu Xoá bởi lệnh Delete

Nếu muốn xoá hẳn record này (có kết hợp thêm lệnh PACK) thì lưu ý phải mở bảng “Table1.dbf” trước đó ở chế độ độc quyền (EXCLUSIVE).

Ví dụ :

Set delete ON
Use Table1 Excl
…………
Dele
Pack
…………

Tuỳ chương trình của bạn, mà bổ sung các lệnh cần thiết vào đoạn code của bạn, nếu chương trình có trở ngại gì, bạn cho biết cụ thể mọi người sẳn sàng tư vấn giúp bạn.

Chào bạn
Character

Newbie.vfp
23-02-2011, 13:22
Thế này, khi em dùng đoạn code:
#define messagebox_Yes 6
#define c_messagebox1 36
#define c_thongbao"Xoa record nay?"

IF MESSAGEBOX(C_thongbao,c_messagebox1,"Chu y") = messagebox_yes
DELETE
IF !EOF()
SKIP 1
IF EOF()
GO BOTTOM
ELSE
SKIP 1
IF EOF()
GO BOTTOM
ELSE
SKIP -1
ENDIF
ENDIF
ENDIF
thisformset.Refresh
ENDIF

để mỗi lần click vào command thì nó sẽ xóa record mình chọn nhưng sao không có tác dụng cũng không báo lỗi gì hết. Sau đó em sửa thành :
#define messagebox_Yes 6
#define c_messagebox1 36
#define c_thongbao"Xoa record nay?"

IF MESSAGEBOX(C_thongbao,c_messagebox1,"Chu y") = messagebox_yes
DELETE && đánh dấu xóa
PACK && xóa hẳn
thisformset.Refresh
ENDIF

thì nó báo lỗi "you must be opened exclusively" ( em tắt chế độ EXCLUSIVE rồi ). Mong mọi người sửa và giải thích giúp em.

luu_luu
23-02-2011, 13:47
Thế này, khi em dùng đoạn code:
#define messagebox_Yes 6
#define c_messagebox1 36
#define c_thongbao"Xoa record nay?"

IF MESSAGEBOX(C_thongbao,c_messagebox1,"Chu y") = messagebox_yes
DELETE
IF !EOF()
SKIP 1
IF EOF()
GO BOTTOM
ELSE
SKIP 1
IF EOF()
GO BOTTOM
ELSE
SKIP -1
ENDIF
ENDIF
ENDIF
thisformset.Refresh
ENDIF

để mỗi lần click vào command thì nó sẽ xóa record mình chọn nhưng sao không có tác dụng cũng không báo lỗi gì hết. Sau đó em sửa thành :
#define messagebox_Yes 6
#define c_messagebox1 36
#define c_thongbao"Xoa record nay?"

IF MESSAGEBOX(C_thongbao,c_messagebox1,"Chu y") = messagebox_yes
DELETE && đánh dấu xóa
PACK && xóa hẳn
thisformset.Refresh
ENDIF

thì nó báo lỗi "you must be opened exclusively" ( em tắt chế độ EXCLUSIVE rồi ). Mong mọi người sửa và giải thích giúp em.


khi nó báo lỗi you must opened exclusive có nghĩa là bạn phải mở file DBF trong chế độ dộc quyền, bạn chỉ cần thêm câu lện này là được:

SET EXCLUSIVE ON
#define messagebox_Yes 6
#define c_messagebox1 36
#define c_thongbao"Xoa record nay?"

IF MESSAGEBOX(C_thongbao,c_messagebox1,"Chu y") = messagebox_yes
DELETE && đánh dấu xóa
PACK && xóa hẳn
thisformset.Refresh
ENDIF

Character
23-02-2011, 13:49
..........

Sau đó em sửa thành :

..........

IF MESSAGEBOX(C_thongbao,c_messagebox1,"Chu y") = messagebox_yes
DELETE && đánh dấu xóa
PACK && xóa hẳn
thisformset.Refresh
ENDIF

thì nó báo lỗi "you must be opened exclusively" ( em tắt chế độ EXCLUSIVE rồi ). Mong mọi người sửa và giải thích giúp em.


Chào bạn Newbie.vfp

Bạn chưa mở bảng ở chế độ độc quyền nên chương trình không cho thực hiện lệnh PACK
Bạn tìm đến đúng dòng lệnh mở bảng Table hiện hành (ở các dòng phía trên hoặc tại Procedure Load) thêm lệnh EXCLUSIVE ngay khi mở bảng.

Ví dụ:
(Viết code tại Procedure Load của Form)

Clos tabl all
Use Table1.dbf EXCLUSIVE && Ví dụ Table1 là tên bảng Table cần xoá record
.......

Nếu còn trở ngại lệnh độc quyền này (EXCLUSIVE) bạn cho biết nhé.

Hoặc để vấn đề của bạn đơn giản hơn, nếu chưa cần xoá hẳn record được đánh dấu xoá, Bạn sử dụng lại đoạn Code ban đầu (viết khá cẩn thận đấy) thêm một dòng lệnh SET DELETE ON ngay đầu đoạn code đó, nó có tác dụng không hiển thị (che) record đã đánh dấu xoá là ổn:

SET DELETE ON && không hiển thị (che) record đã đánh dấu xoá
#define messagebox_Yes 6
#define c_messagebox1 36
#define c_thongbao"Xoa record nay?"

IF MESSAGEBOX(C_thongbao,c_messagebox1,"Chu y") = messagebox_yes
DELETE
IF !EOF()
SKIP 1
IF EOF()
GO BOTTOM
ELSE
SKIP 1
IF EOF()
GO BOTTOM
ELSE
SKIP -1
ENDIF
ENDIF
ENDIF
thisformset.Refresh
ENDIF

Lệnh PACK có thể thực hiện (ở chế độ mở bảng Table độc quyền) trước hoặc sau khi phát lệnh thoát Form này.

Chào bạn
Character

Newbie.vfp
24-02-2011, 07:13
khi nó báo lỗi you must opened exclusive có nghĩa là bạn phải mở file DBF trong chế độ dộc quyền, bạn chỉ cần thêm câu lện này là được:

SET EXCLUSIVE ON
#define messagebox_Yes 6
#define c_messagebox1 36
#define c_thongbao"Xoa record nay?"

IF MESSAGEBOX(C_thongbao,c_messagebox1,"Chu y") = messagebox_yes
DELETE && đánh dấu xóa
PACK && xóa hẳn
thisformset.Refresh
ENDIF

Em dùng doạn code này thì báo lỗi ở lệnh Pack nên em xóa và run thử thì ok :D Tks anh LuLu với anh Character nhiều :D

Character
24-02-2011, 09:50
Gửi Newbie.Vfp

Chúc mừng bạn sử dụng chương trình được rồi. Nếu có thời gian bạn tham khảo thêm gợi ý về chương trình của bạn như sau:

- Biểu mẫu bạn đang dùng là tập biểu mẫu (Formset), ví dụ có hai biểu mẫu con tên (name) là TenFormcon1, TenFormcon2

- Bạn muốn dùng lệnh DELETE đánh dấu xoá một record (thuộc bảng Table hiện hành, ví dụ tên bảng là Table1.dbf) đang hiển thị trên tập biểu mẫu. Sau đó con trỏ record sẽ chuyển đến vị trí record kế tiếp hoặc trước đó theo ý định trước (dùng cấu trúc If … Else …. Endi với các lệnh Skip, go bottom … là tốt, cẩn thận đấy). Lưu ý là khi dùng lệnh DELETE, trước đó cần khai báo thêm mệnh đề SET DELETE ON để chương trình không hiển thị (che dấu) record đã đánh dấu xoá.

- Do lần đầu bạn dùng lệnh PACK nên cần hướng dẫn rõ hơn:
Lệnh PACK: là lệnh xoá hẵn record đã được đánh dấu xoá (bởi lệnh DELETE) ra khỏi chương trình, bắt buộc bảng Table1.dbf phải mở độc quyền trước đó (khai báo USE Table1.dbf EXCLUSIVE hoặc dùng mệnh đề SET EXCLUSIVE ON). Khi chương trình thực hiện xong lệnh PACK, thông thường nên hủy bỏ lệnh độc quyền của bảng Table1.dbf này ngay để người dùng khác truy cập, cập nhật nếu có (khai báo thêm mệnh đề SET EXCLUSIVE OFF sau lệnh PACK).

Gửi bạn tham khảo đoạn code sau đây có thể dùng thay đoạn Code trước đó:

SET DELETE ON && không hiển thị (che) record đã đánh dấu xoá

IF MESSAGEBOX("Xoa record nay (Y/N) ? ",36,"Xac nhan") = 6
DELETE && chỉ đánh dấu xoá chứ chưa xoá
IF !EOF()
SKIP
IF EOF()
GO BOTTOM
ELSE
SKIP
IF EOF()
GO BOTTOM
ELSE
SKIP -1
ENDIF
ENDIF
ENDIF
Thisformset.TenFormcon1.Refresh && nếu cần làm tươi form con 1
Thisformset.TenFormcon2.Refresh && nếu cần làm tươi form con 2
ENDIF

Chào.

hshason
24-02-2011, 14:18
Các Bạn ơi ! Mình Tạo 1 form đăng nhập và mình muốn tạo 1 checkbox có chức năng: khi được chọn thì ghi nhớ tên Đăng nhập và mật khẩu và ngược lại.. nhưng mình ko bít viết code thế nào và ở đâu... Mọi người giúp mình vs. Thank thank nhìu lắm !!^^

Nay lướt qua diễn đàn thấy hình như chưa có ai trả lời vấn đề này cho bạn
Bạn có thể dùng 1 File text để lưu lại các thông tin mà bạn cần, đến khi chạy chương trình thì vào đó lấy ra. Điều quan trọng là bạn hãy mã hóa nội dung của File đó để mọi thứ đều an toàn.
Bạn tham khảo cái này nhé
Mình tạo 2 Function, 1 cái save và 1 cái load

Function SaveInfoLogin
LPARAMETER tcUserName, tcPassword
LOCAL lcInfoLogin, lcPath, vfCrLf
*-- Khai bao ham API
DECLARE INTEGER WritePrivateProfileString IN Win32API AS WritePrivStr STRING, STRING, STRING, STRING
vfCrLf = CHR(13) + CHR(10) &&Xuong dong
lcPath = SYS(5) + CURDIR() &&Duong dan mac dinh

lcFile = lcPath + "InfoLogin.pwr" &&Ten file tuy y
IF FILE(lcFile)
= WritePrivStr("INFOLOGIN", "UserName", tcUserName, lcFile)
= WritePrivStr("INFOLOGIN", "Password", tcPassword, lcFile)
ELSE
lcInfoLogin ="[INFOLOGIN]" + vfCrLf + ;
"UserName=" + tcUserName + vfCrLf + ;
"Password=" + tcPassword + vfCrLf
STRTOFILE(lcInfoLogin,lcFile)
ENDIF
EndFunc

*Ham Load thong tin trong file InfoLogin.pwr
Function LoadInfoLogin
LPARAMETER tcUserName, tcPassword
LOCAL lcInfoLogin, lcPath
DECLARE INTEGER GetPrivateProfileString IN Win32API AS GetPrivStr STRING, STRING, STRING, STRING @, INTEGER, STRING
lcPath = SYS(5) + CURDIR()
lcFile = lcPath + "InfoLogin.pwr" &&Ten file da luu
tcUserName = ""
tcPassword = ""
IF FILE(lcFile)
lcBuffer = SPACE(200) + CHR(0)
IF GetPrivStr("INFOLOGIN", "UserName", "",@lcBuffer, LEN(lcBuffer), lcFile) > 0
tcUserName = ALLTRIM(STRTRAN(lcBuffer,CHR(0)," "))
ENDIF
lcBuffer = SPACE(200) + CHR(0)
IF GetPrivStr("INFOLOGIN", "Password", "",@lcBuffer, LEN(lcBuffer), lcFile) > 0
tcPassword = ALLTRIM(STRTRAN(lcBuffer,CHR(0)," "))
ENDIF
ENDIF
EndFunc

- Sử dụng:
vd: lcUserName = "ABC"
lcPassword = "123456"
+ Sau khi đăng nhập OK thì gọi hàm: =SaveInfoLogin(lcUserName,lcPassword)
+ Init của Form đang nhập:
Local lcUserName,lcPassword
= LoadInfoLogin(@lcUserName,@lcPassword)
và gán lcUserName,lcPassword cho textbox trên form
- Còn vấn đề mã hóa bạn có thể sử dụng _CryptAPI mà Fox đã có sẵn rồi chỉ việc dùng thôi
Mình có làm 1 project trong file đính kèm để bạn tham khảo (nếu cần)
http://download520.mediafire.com/nm73cl2l2dkg/ydnloe7phbyh338/SaveInfoLogin.rar

Newbie.vfp
25-02-2011, 09:49
Gửi Newbie.Vfp

Chúc mừng bạn sử dụng chương trình được rồi. Nếu có thời gian bạn tham khảo thêm gợi ý về chương trình của bạn như sau:

- Biểu mẫu bạn đang dùng là tập biểu mẫu (Formset), ví dụ có hai biểu mẫu con tên (name) là TenFormcon1, TenFormcon2

- Bạn muốn dùng lệnh DELETE đánh dấu xoá một record (thuộc bảng Table hiện hành, ví dụ tên bảng là Table1.dbf) đang hiển thị trên tập biểu mẫu. Sau đó con trỏ record sẽ chuyển đến vị trí record kế tiếp hoặc trước đó theo ý định trước (dùng cấu trúc If … Else …. Endi với các lệnh Skip, go bottom … là tốt, cẩn thận đấy). Lưu ý là khi dùng lệnh DELETE, trước đó cần khai báo thêm mệnh đề SET DELETE ON để chương trình không hiển thị (che dấu) record đã đánh dấu xoá.

- Do lần đầu bạn dùng lệnh PACK nên cần hướng dẫn rõ hơn:
Lệnh PACK: là lệnh xoá hẵn record đã được đánh dấu xoá (bởi lệnh DELETE) ra khỏi chương trình, bắt buộc bảng Table1.dbf phải mở độc quyền trước đó (khai báo USE Table1.dbf EXCLUSIVE hoặc dùng mệnh đề SET EXCLUSIVE ON). Khi chương trình thực hiện xong lệnh PACK, thông thường nên hủy bỏ lệnh độc quyền của bảng Table1.dbf này ngay để người dùng khác truy cập, cập nhật nếu có (khai báo thêm mệnh đề SET EXCLUSIVE OFF sau lệnh PACK).

Gửi bạn tham khảo đoạn code sau đây có thể dùng thay đoạn Code trước đó:

SET DELETE ON && không hiển thị (che) record đã đánh dấu xoá

IF MESSAGEBOX("Xoa record nay (Y/N) ? ",36,"Xac nhan") = 6
DELETE && chỉ đánh dấu xoá chứ chưa xoá
IF !EOF()
SKIP
IF EOF()
GO BOTTOM
ELSE
SKIP
IF EOF()
GO BOTTOM
ELSE
SKIP -1
ENDIF
ENDIF
ENDIF
Thisformset.TenFormcon1.Refresh && nếu cần làm tươi form con 1
Thisformset.TenFormcon2.Refresh && nếu cần làm tươi form con 2
ENDIF

Chào.
Hóa ra là vậy, thảo nào em cứ thắc mắc ko dùng được lệnh Pack. Tks anh nhiều :D

gianglangtukg
26-02-2011, 21:12
em co doan code nay:
SELECT Nhaphang.mamh, Nhaphang.tenmh, Nhaphang.soluong AS n,;
IIF(Xuathang.soluong#0,Xuathang.soluong,0) AS x,;
Nhaphang.soluong-IIF(Xuathang.soluong#0,Xuathang.soluong,0) AS tonkho;
FROM nhaphang ;
LEFT OUTER JOIN xuathang ;
ON Nhaphang.mamh = Xuathang.mamh ;
WHERE nhaphang.mamh = smamh


Nhaphang.soluong AS n,: n, la gi?
IIF(Xuathang.soluong#0,Xuathang.soluong,0) AS x, : nghia la gj?
LEFT OUTER JOIN xuathang : y nghia la sao

cac pac giai thich jup e voi

tungvv
27-02-2011, 08:54
Chào anh em!
Mình muốn thay đổi thuộc tính fontname của nhiều đối tượng trong nhiều form, nếu làm thủ công thì lâu quá vì phải chỉnh sửa từng form, trong từng form lại có nhiều đối tượng, bạn nào có thể giúp mình hướng dẫn cách viết code để dò tìm và thay thế fontname ="FontA" về Fontname -"FontB".
xin cảm ơn!

hoangnnm
27-02-2011, 10:40
Chào anh em!
Mình muốn thay đổi thuộc tính fontname của nhiều đối tượng trong nhiều form, nếu làm thủ công thì lâu quá vì phải chỉnh sửa từng form, trong từng form lại có nhiều đối tượng, bạn nào có thể giúp mình hướng dẫn cách viết code để dò tìm và thay thế fontname ="FontA" về Fontname -"FontB".
xin cảm ơn!

Nếu bạn tạo form scx thì có thể làm như sau :
- Chạy 1 vòng lặp quét ra các file .scx : xem ví dụ hàm ADIR()
- use file .scx lên ( ex : use 1.scx )
- Chạy lệnh :


replace properties with strtran( properties , 'FontName = "FONTA"', 'FontName = "FONTB"') all

Còn 1 điều cần lưu ý, nếu font của đối tượng là mặc định ( arial ) thì sẽ không có dòng FontName = 'Arial' trong trường properties , bạn cần phải thêm vào như sau :


replace properties with 'FontName = "FONTB"' + Chr(13) + properties for occur('FontName', properties ) = 0 &&& ở đây có thể thêm điều kiện cho class nào

Chúc thành công .

luu_luu
28-02-2011, 07:49
em co doan code nay:
SELECT Nhaphang.mamh, Nhaphang.tenmh, Nhaphang.soluong AS n,;
IIF(Xuathang.soluong#0,Xuathang.soluong,0) AS x,;
Nhaphang.soluong-IIF(Xuathang.soluong#0,Xuathang.soluong,0) AS tonkho;
FROM nhaphang ;
LEFT OUTER JOIN xuathang ;
ON Nhaphang.mamh = Xuathang.mamh ;
WHERE nhaphang.mamh = smamh


Nhaphang.soluong AS n,: n, la gi?
IIF(Xuathang.soluong#0,Xuathang.soluong,0) AS x, : nghia la gj?
LEFT OUTER JOIN xuathang : y nghia la sao

cac pac giai thich jup e voi

n hay x chỉ là tên cột tự mình đặt thôi, tại vì field soluong cùng có trong 2 file xuathang và nhaphang,nếu không khai báo thì trong cú pháp SQL trên sẽ có hai field soluong_a và soluong_b, nên bạn có thể đặt tên tùy ý bạn nhưng không được trùng nhau, thí dụ:
Nhaphang.soluong AS soluong_nhap,xuathang.soluong AS soluong_xuat
- LEFT OUTER JOIN : kết nối 2 file nhap & xuat nhưng dữ liệu nguồn dựa trên dữ liệu bên trái <file nhap>, căn cứ từ khóa của mamh của file nhap mà liên kết số liệu của file xuất.
RIGHT OUTER JOIN : kết nối 2 file nhap & xuat nhưng dữ liệu nguồn dựa trên dữ liệu bên phải <file xuat>, căn cứ từ khóa của mamh của file xuat mà liên kết số liệu của file nhap.
FULL OUTER JOIN : kết nối 2 file nhap & xuat nhưng dữ liệu nguồn dựa trên dữ liệu của cả 2 bên

tungvv
28-02-2011, 10:32
Nếu bạn tạo form scx thì có thể làm như sau :
- Chạy 1 vòng lặp quét ra các file .scx : xem ví dụ hàm ADIR()
- use file .scx lên ( ex : use 1.scx ).
Cám ơn bạn đã giúp đỡ, nhờ câu lệnh của bạn mình chạy được rồi. Cảm ơn nhiều nhé.
Cho mình hỏi thêm: các clas khi mình sửa các file*.VCX thì các tệp *.VCT có thay đổi theo hay ko? hay là phải làm một số động thái khác nữa để ghi lại ?

robertquy
28-02-2011, 11:38
Các bạn ơi cho mình hỏi!
VPF9 đã làm giao diện & nhập liệu sử dụng tiếng Hoa được không?

gianglangtukg
28-02-2011, 12:16
cam on pac luu_luu nhieu nha

minh muon tao nut THEM, XOA , SUA, cua 1 bang nao do , pac nao bit chi minh voi, minh dag can gap

Newbie.vfp
03-03-2011, 08:23
Xin chào mọi người, em đang tập dùng câu lệnh Begin - End Transaction. Ko hiểu sao lúc đầu thì chạy ngon, sau thì nó báo lỗi tùm lum hết. Nhờ các bro giải thích rõ giúp em về cú pháp và nguyên tắc hoạt động của câu lệnh này với.

Parker Pen
03-03-2011, 20:22
minh muon tao nut THEM, XOA , SUA, cua 1 bang nao do , pac nao bit chi minh voi, minh dag can gap

Đươc gửi bởi Newbie.vfp

Xin chào mọi người, em đang tập dùng câu lệnh Begin - End Transaction. Ko hiểu sao lúc đầu thì chạy ngon, sau thì nó báo lỗi tùm lum hết. Nhờ các bro giải thích rõ giúp em về cú pháp và nguyên tắc hoạt động của câu lệnh này với.



Gửi hai bạn gianglangtukg, Newbie.vfp

Vấn đề các bạn nêu thường dùng thực hiện các giao dịch (TRANSACTION) dữ liệu, ví dụ thiết kế các nút Thêm, Sửa, giúp ta thực hiện 04 chức năng cốt lõi, cần thiết trong quá trình cập nhật dữ liệu là Thêm, Lưu, Sửa hoặc Hủy.
Về hình thức, thường 04 chức năng này được xây dựng hiển thị trên 02 nút Thêm, Sửa nằm kèm với một dãy các nút khác, ví dụ có tên là Đầu, Trước, Kế, Cuối, Tìm, Xem, Xoá, Thoát.
Tuỳ theo tính chất, nhu cầu công việc mà ta thiết kế số nút phù hợp trong dãy để sử dụng.

1-Cấu trúc giao dịch (phép truyền dữ liệu):

Một giao dịch sẽ bắt đầu từ lệnh BEGIN TRANSACTION, và sau đó buộc phải kết thúc bằng lệnh END TRANSACTION hoặc ROLLBACK tương ứng. Có thể lồng tối đa 05 cấp BEGIN TRANSACTION … END TRANSACTION.

Hành động Click một trong 02 nút Thêm, Sửa có nghĩa là ta xử lý một giao dịch.

Hành động 1: Click 01 trong 02 nút Thêm hoặc Sửa: Tên nút Thêm (Caption) sẽ đổi thành Lưu, tên nút Sửa sẽ đổi thành Hủy là ta thực hiện lệnh:
BEGIN TRANSACTION : khai báo bắt đầu một giao dịch, khoá bản ghi.
……………….

Sau đó là một trong hai hành động:

Hành động 2a: ta Click nút Lưu: Tên nút này (Caption) sẽ đổi thành Thêm là ta thực hiện lệnh:
END TRANSACTION : khai báo kết thúc và cập nhật thực sự những thay đổi dữ liệu vào (điã) Database, rồi mở khoá bản ghi.

Hành động 2b: ta Click nút Hủy: Tên nút này (Caption) sẽ đổi thành Sửa là ta thực hiện lệnh:
ROLLBACK : Hủy giao dịch, phục hồi lại dữ liệu như trước khi bắt đầu giao dịch, rồi mở khoá bản ghi.

Nếu không bắt đầu bằng BEGIN TRANSACTION, lệnh END TRANSACTION hoặc lệnh ROLLBACK sẽ gây lỗi (tùm lum).

Các bạn tìm, xem thêm tài liệu trong các chương như Lập trình trong môi trường nhiều người dùng (Lập trình chia sẻ) còn nhiều vấn đề khác liên quan mật thiết đến vấn đề này.

2-Việc viết Code thực hiện các giao dịch nêu trên khá phức tạp, liên quan nhiều thuộc tính (Property), phương thức (Method), tuy nhiên các Bạn không lo vì trong Samples của VFP có sẵn, các bạn tham khảo, tìm hiểu dần, chỉnh sửa, Việt hoá tên các nút theo ý là dùng tốt.

Tôi có sẵn một ít dãy nút (thư viện) đang dùng, font tiếng Việt (.Vntime – Bảng mã TCVN3-ABC), nhưng không chuyên nghiệp lắm, đưa vào Form là dùng được. Nếu cần tham khảo, các bạn gửi Email tôi chuyển.

Chào
Parker Pen

khoalebach
04-03-2011, 07:17
Ví dụ tôi co 5 tập tin foxpro: taptin1.dbf, taptin2.dbf, taptin3.dbf, taptin4.dbf, taptin5.dbf tôi muốn append dữ liệu từ 5 tập tin trên vào tập tin Dulieuchung.dbf.
- Xin chỉ dùm câu lệnh để làm việc trên. Cảm ơn!

Character
04-03-2011, 08:23
Ví dụ tôi co 5 tập tin foxpro: taptin1.dbf, taptin2.dbf, taptin3.dbf, taptin4.dbf, taptin5.dbf tôi muốn append dữ liệu từ 5 tập tin trên vào tập tin Dulieuchung.dbf.
- Xin chỉ dùm câu lệnh để làm việc trên. Cảm ơn!

Chào bạn Khoalebach …

Bạn Tnttx đã có hỏi vấn đề tương tự như của bạn và được Parker Pen trả lời, Bạn có thể tham khảo tại link sau:
http://ddth.com/showthread.php?t=19979&page=82

Chào
Character

khoalebach
04-03-2011, 08:38
Cảm ơn bạn, tui đã xem chủ đề trên. Tuy nhiên cách đó thì đã biết nhưng có vẽ "thủ công mỹ nghệ" quá!

hoangnnm
04-03-2011, 09:44
Cảm ơn bạn, tui đã xem chủ đề trên. Tuy nhiên cách đó thì đã biết nhưng có vẽ "thủ công mỹ nghệ" quá!

Đó là cách duy nhất và không hề "thủ công mỹ nghệ".
Đương nhiên trường hợp bạn có khoảng 100 bảng thì có thể viết vòng lặp để làm điều đó .

khoalebach
04-03-2011, 09:52
Thực chất Tui đang có 15 cái tập tin. Bạn chỉ giúp cái vòng lập với (hoàn toàn mù tịt về foxpro nhưng mấy cái phần mềm ở cơ quan toàn bằng foxpro!). Tại sao mình không có một forum riêng cho foxpro vậy các bạn?

Parker Pen
04-03-2011, 10:17
Thực chất Tui đang có 15 cái tập tin. Bạn chỉ giúp cái vòng lập với (hoàn toàn mù tịt về foxpro nhưng mấy cái phần mềm ở cơ quan toàn bằng foxpro!). Tại sao mình không có một forum riêng cho foxpro vậy các bạn?

- Trường hợp tất cả các file DBF của bạn có cùng cấu trúc, có tên chỉ khác nhau ở số thứ tự đuôi (theo ví dụ của bạn có 15 DBF là taptin1.dbf, taptin2.dbf, taptin3.dbf, taptin4.dbf, taptin5.dbf ... taptin15.dbf) thì bạn có thể tham khảo ví dụ đơn giản này (tuy nhiên cách này cũng không kém vẻ thủ công mỹ nghệ):

USE Dulieuchung
For i=1 to 15 && có 15 DBF cần bổ sung
cDBF=’taptin’+Allt(Str(i))
APPEND FROM &cDBF
Endf

- Trường hợp tên các tập tin DBF của bạn là bất kỳ thì phải dùng hàm quét tìm lấy tên từng tâp tin DBF để thi hành, phức tạp hơn nhiều cái lệnh thủ công mỹ nghệ, đơn giản mà không kém hiệu quả kia.

Sau này bạn phát hiện ra phương pháp mới nào đó, có vẻ khoa học hiện đại hơn, sớm giới thiệu để mọi người cùng tham khảo.

Gửi lời cám ơn bạn Hoangnnm có nhận xét.

Chào
Parker Pen

khoalebach
04-03-2011, 10:28
Thật không may là mình thuộc trường hợp thứ 2 bạn ah. Cấu trúc thì đồng nhất nhưng tên các tập tin không giống nhau. Bạn chỉ dùm luôn với. Cái vụ thủ công mỹ nghệ là tui đùa thôi mà !!! đừng giận nhé!

hoangnnm
04-03-2011, 10:47
Cũng đang rảnh nên viết lẹ 1 cái bạn có thể tham khảo :


Private m.tblname, _path, _struc1, _Struc2
m.tblname = [E:\***\Dulieuchung] &&& flle chinh
_path = [E:\temp] &&& duong dan thu muc chua dbf can append vao

if used([_Source1])
Use in _Source1
Endif

if used([_Source2])
Use in _Source2
Endif

Use (m.tblname) in 0 again share alias _Source1
_struc1 = GettableStruc([_Source1])

_path = addbs(_path)
Private i, _max, _adir
_max = adir( _adir, _path + [*.dbf], [ARHS] )
?_max
For i = 1 to _max
use ( _path + _Adir(i,1) ) in 0 again share alias _Source2
Select _Source2
_struc2 = GettableStruc([_Source2])
if _struc1 == _struc2
*Select _Source1
*Append from dbf([_Source2])
?_Adir(i,1) + [-] + _struc2 &&& o day chi in ra de xem , co the thay the bang append hay gi do
Endif
Use in _Source2
Endfor

Use in _Source1
* Hoang 04/03/2011 10:34:31 AM ================================================== =
Procedure GettableStruc &&& lay cau truc dbf
Para _alias
Private m.ftmp, _kq
m.ftmp = addbs(sys(2023)) + Sys(2015)
_kq = []

Select (_alias)
Copy Struc extend to ( m.ftmp )

Select 0
use ( m.ftmp)
Index on field_name tag field_name

Scan
_kq = _kq + alltrim(Field_name)+alltrim(field_type)
Endscan
Use

Return _kq

P/s : hàm GettableStruc này có thể tùy chỉnh theo mục đích của bạn ( có thể là get struc để tạo bảng mới chẳng hạn.

khoalebach
04-03-2011, 10:58
Cảm ơn rất nhiều! tin rằng nó cũng sẽ giúp ích được cho nhiều người khác nữa.

gianglangtukg
04-03-2011, 21:55
Pac Parker Pen cho minh xin voi, mail cua minh : gianglangtu@gmail.com, thanks pac nhieu

Parker Pen
05-03-2011, 08:27
Pac Parker Pen cho minh xin voi, mail cua minh : gianglangtu@gmail.com, thanks pac nhieu

Chào bạn Gianglangtukg

Tôi đã gửi Email Buttons.rar để bạn tham khảo. Nếu cần gì trao đổi thêm.

Chào Bạn, Chúc thành công.
Parker Pen.

gianglangtukg
06-03-2011, 08:13
thanks Parker Pen nhieu nha

[=========> Bổ sung bài viết <=========]

sngay = ALLTRIM(thisform.text1.text)
IF sngay=="" then
MESSAGEBOX("Hay nhap thang can tim vao",0,"Chu y")
ELSE
IF sngay>"12" OR sngay<"1" then
MESSAGEBOX("Thang sai quy cach",0,"Chu y")
else
SELE 1
USE MATHANG
LOCATE FOR str(MONTH(mathang.ngaynhap))=sngay
IF FOUND() then

SELECT MATHANG.mamh, MATHANG.tenmh, MATHANG.ngaynhap, MATHANG.soluong AS Nhap,;
IIF(chitietdathang.soluong#0,chitietdathang.soluon g,0) AS Xuat,;
MATHANG.soluong-IIF(chitietdathang.soluong#0,chitietdathang.soluon g,0) AS TonKho;
FROM MATHANG ;
LEFT OUTER JOIN chitietdathang ;
ON MATHANG.mamh = chitietdathang.mamh ;
WHERE MONTH(mathang.ngaynhap) = sngay


ELSE
MESSAGEBOX("Thang can tim khong ton tai! Hay nhap thang can tim khac",0,"Thong bao")
ENDIF
ENDIF
ENDIF



minh muon tim so luong ton theo thang, nhung tim hk dc, hk bit dieu kien loc de lay ra thang, pac Packer Pen va cac pac giup voi

Parker Pen
06-03-2011, 20:15
thanks Parker Pen nhieu nha

[=========> Bổ sung bài viết <=========]

sngay = ALLTRIM(thisform.text1.text)
IF sngay=="" then
MESSAGEBOX("Hay nhap thang can tim vao",0,"Chu y")
ELSE
IF sngay>"12" OR sngay<"1" then
MESSAGEBOX("Thang sai quy cach",0,"Chu y")
else
SELE 1
USE MATHANG
LOCATE FOR str(MONTH(mathang.ngaynhap))=sngay
IF FOUND() then

SELECT MATHANG.mamh, MATHANG.tenmh, MATHANG.ngaynhap, MATHANG.soluong AS Nhap,;

IIF(chitietdathang.soluong#0,chitietdathang.Soluon g,0) AS Xuat,;
MATHANG.soluong-IIF(chitietdathang.soluong#0,chitietdathang.soluon g,0) AS TonKho;

FROM MATHANG ;
LEFT OUTER JOIN chitietdathang ;
ON MATHANG.mamh = chitietdathang.mamh ;
WHERE MONTH(mathang.ngaynhap) = sngay


ELSE
MESSAGEBOX("Thang can tim khong ton tai! Hay nhap thang can tim khac",0,"Thong bao")
ENDIF
ENDIF
ENDIF



minh muon tim so luong ton theo thang, nhung tim hk dc, hk bit dieu kien loc de lay ra thang, pac Packer Pen va cac pac giup voi


Bạn xem lại 02 dòng sau, khai báo sai kiểu biến: sngay

Tại dòng đầu tiên :

sngay = ALLTRIM(thisform.text1.text) && biến sngay kiểu chuỗi
…………………
…………………
Đến dòng
…………………
…………………
WHERE MONTH(mathang.ngaynhap) = sngay && MONTH(mathang.ngaynhap) là kiểu số nên không thể so sánh với biến sngay là kiểu chuỗi


Bạn thử thay đoạn code trên của bạn như sau:

*-----------------------------------
sngay = ALLTRIM(Thisform.text1.text)
IF Empt(sngay) then
MESSAGEBOX("Hay nhap thang can tim ",0,"Chu y")
ELSE
IF sngay>"12" OR sngay<"1" then
MESSAGEBOX("Nhap sai quy cach Thang ... ",0,"Chu y")
Else
SELE 1
USE MATHANG
LOCATE FOR Allt(Str(MONTH(mathang.ngaynhap)))=sngay
IF FOUND() then
SELECT MATHANG.mamh, MATHANG.tenmh, MATHANG.ngaynhap, MATHANG.soluong AS Nhap,;
IIF(chitietdathang.soluong#0,chitietdathang.soluon g,0) AS Xuat,;
MATHANG.soluong-IIF(chitietdathang.soluong#0,chitietdathang.soluon g,0) AS TonKho;
FROM MATHANG ;
LEFT OUTER JOIN chitietdathang ;
ON MATHANG.mamh = chitietdathang.mamh ;
WHERE Allt(STR(MONTH(mathang.ngaynhap))) = sngay
ELSE
MESSAGEBOX("Thang "+sngay+" khong ton tai!. Hay nhap thang khac ",0,"Thong bao")
Thisform.text1.text=''
ENDIF
ENDIF
ENDIF
*-----------------------------------

P/S: Bạn nên hạn chế viết tắt và nên trình bày chữ có dấu để tránh hiểu nhầm ý bạn.

Chào Bạn
Parker Pen

gianglangtukg
06-03-2011, 21:32
không được Packer Pen ơi, nó báo là file mathang.dbf không tồn tại

Parker Pen
06-03-2011, 22:42
không được Packer Pen ơi, nó báo là file mathang.dbf không tồn tại

Do không xem được những cái cần thiết trong chương trình của Bạn. Tôi chỉ đọc được và kiểm tra gói gọn trong phạm vi đoạn Code của bạn gửi. Qua đó chỉ kiểm tra cú pháp, dò lỗi Logic của đoạn Code, giúp bạn những gì có thể.

Nhận thấy trong đoạn Code này bạn có sử dụng 02 bảng table là MATHANG.DBF và CHITIETDATHANG.DBF chứ không biết có hay không sự tồn tại của 02 bảng Table này trong chương trình của bạn, kể cả cấu trúc, kiểu dữ liệu, khai báo một số bảng trước đó… như thế nào, nên không thể trả lời Bạn ngay được.

Một vài gợi ý về kiểm tra lỗi MATHANG.DBF không tồn tại:

- Bạn kiểm tra xem bảng này đã được tạo chưa, tồn tại trong thư mục nào kể cả bảng CHITIETDATHANG.DBF, Form có nhận diện được không ?

- Theo tôi, Bạn nhập 02 dòng lệnh sau taị Procedure Load của Form này:
(Nếu cần khai báo các bảng Table thì nên khai báo tại Procedure Load này)

SELE 1
USE MATHANG

Trong đoạn Code của bạn đã nêu, xóa dòng lệnh: USE MATHANG
………….
………….
SELE 1 && giữ lại dòng này
USE MATHANG && xoá dòng lệnh này do đã khai báo tại Procedure Load
Go top && thêm dòng lệnh mới này
………….
………….

Bạn cố gắng tìm tài liệu đọc thêm

Chào
Parker Pen

khoalebach
07-03-2011, 10:37
- Có cách nào export dữ liệu từ tập tin foxpro sang access không vậy các bạn?
- Nếu không có thì dùng lệnh nào để copy toàn bộ dữ liệu trong table foxpro (để dán qua table access)?

hoangnnm
07-03-2011, 11:13
- Có cách nào export dữ liệu từ tập tin foxpro sang access không vậy các bạn?
- Nếu không có thì dùng lệnh nào để copy toàn bộ dữ liệu trong table foxpro (để dán qua table access)?
Có 2 cách :
1. Trong access đã có sẵn chức năng import , chỉ cần chọn kiểu dữ liệu là dbf là ok .
2. Viết code insert từng dòng .

khoalebach
07-03-2011, 13:23
- Cách thứ 1: từ access không import vào được (có thể là không hổ trợ foxpro)
- Bạn chỉ dùm cách thứ 2 với, hoặc chỉ lệnh copy tất cã record trong table foxpro với. cảm ơn bạn nhiều

hoangnnm
07-03-2011, 14:37
- Cách thứ 1: từ access không import vào được (có thể là không hổ trợ foxpro)
- Bạn chỉ dùm cách thứ 2 với, hoặc chỉ lệnh copy tất cã record trong table foxpro với. cảm ơn bạn nhiều

Vậy bạn copy ra excel đi rồi từ access import file excel vào .
Cú pháp thì rất đơn giản : copy to C:\***.xls type xls

Cách thứ 2 thì phức tạp hơn , và cũng có rất nhiều cách làm, đại loại là như thế này :
- Bạn mở 1 bảng
- Xác định bảng này có bao nhiêu côt để sinh ra câu lệnh insert như là :


insert into xx( x1, x2 , x3) values ( ' ' , '' , '' )

- Ví dụ bảng có 100 records thì lặp hết 1 bảng sinh ra 100 dòng như vậy
- Lưu lại vào đâu đó, file txt chẳng hạn .
- Xong xuôi hết vào access dán đoạn lệnh sinh dữ liệu vừa có để chạy .

fanvsf
07-03-2011, 15:25
thanks Parker Pen nhieu nha

[=========> Bổ sung bài viết <=========]

sngay = ALLTRIM(thisform.text1.text)
IF sngay=="" then
MESSAGEBOX("Hay nhap thang can tim vao",0,"Chu y")
ELSE
IF sngay>"12" OR sngay<"1" then
MESSAGEBOX("Thang sai quy cach",0,"Chu y")
else
SELE 1
USE MATHANG
LOCATE FOR str(MONTH(mathang.ngaynhap))=sngay
IF FOUND() then

SELECT MATHANG.mamh, MATHANG.tenmh, MATHANG.ngaynhap, MATHANG.soluong AS Nhap,;
IIF(chitietdathang.soluong#0,chitietdathang.soluon g,0) AS Xuat,;
MATHANG.soluong-IIF(chitietdathang.soluong#0,chitietdathang.soluon g,0) AS TonKho;
FROM MATHANG ;
LEFT OUTER JOIN chitietdathang ;
ON MATHANG.mamh = chitietdathang.mamh ;
WHERE MONTH(mathang.ngaynhap) = sngay


ELSE
MESSAGEBOX("Thang can tim khong ton tai! Hay nhap thang can tim khac",0,"Thong bao")
ENDIF
ENDIF
ENDIF



minh muon tim so luong ton theo thang, nhung tim hk dc, hk bit dieu kien loc de lay ra thang, pac Packer Pen va cac pac giup voi

Chào bạn gianglangtukg

Mình xin có vài ý kiến đóng góp với bạn một chút
- Mình thấy đoạn code của bạn viết khi sử dụng Form chỉ cần khai báo text1 là dạng dữ liệu kiểu date (ta bỏ qua được khâu kiểm tra tính hợp lệ của dữ liệu. Nếu bạn nhập dữ liệu vào textbox có dạng là date chương trình tự thông báo sai nếu bạn nhập sai)

Khi đó biến sngay sẽ là :
sngay = Month(thisform.text1.value) chứ không phải là
sngay = ALLTRIM(thisform.text1.text)

- Bạn có thể sử dụng Query ngay trong Project Manager, có thể Add rất nhiều table vào trong đó. Query sẽ tự động viết code điều đó làm giảm thiểu rất nhiều công sức viết chương trình cho mình. Sử dụng Queries rất thuận tiện cho việc lọc dữ liệu khi sử dụng mệnh đề Where

- Đoạn code của bạn có thể viết như sau :
sngay = Month(thisform.text1.value)

SELECT MATHANG.mamh, MATHANG.tenmh, MATHANG.ngaynhap, MATHANG.soluong AS Nhap,;
IIF(chitietdathang.soluong#0,chitietdathang.soluon g,0) AS Xuat,;
MATHANG.soluong-IIF(chitietdathang.soluong#0,chitietdathang.soluon g,0) AS TonKho;
FROM MATHANG ;
LEFT OUTER JOIN chitietdathang ;
ON MATHANG.mamh = chitietdathang.mamh ;
WHERE MONTH(mathang.ngaynhap) = sngay ;
INTO CURSO hangton
Selec hangton
if recc()>0
Brow
Else
Wait window " Không có tháng nhập hàng" Nowait
ENDIF

Chúc bạn thành công

khoalebach
07-03-2011, 16:34
Thật bất hạnh là không thể xuất ra excell vì tới trên 600.000 records! nó là visial fox nên import trực tiếp vào access lại không được. không có cách nào copy - paste sao các bạn?

thichmbbg
08-03-2011, 09:34
Minh đang là quen với VFP nên chưa biết nhiều về nó lắm. Bạn có thể giúp mình chút được ko?
Chả là thế này: Mình có 2 bảng Bảng A: Donvi,Hoten,Sthe,thang,tlthang13
Bảng B: Donvi, Hoten, Sthe, thang, thuong8
Mình muốn Copy giá trị của Cột tlthang13 của bảng A vào cột Thuong8 của bảng B theo Thang và Sthe (Những người có cung Sthe thì mới Copy, của tháng nào thì copy tháng đó).
Minh loay hoay mãi mà ko được.
Các bạn giúp mình nha. Thank you very much!

darshana
08-03-2011, 10:34
Minh đang là quen với VFP nên chưa biết nhiều về nó lắm. Bạn có thể giúp mình chút được ko?
Chả là thế này: Mình có 2 bảng Bảng A: Donvi,Hoten,Sthe,thang,tlthang13
Bảng B: Donvi, Hoten, Sthe, thang, thuong8
Mình muốn Copy giá trị của Cột tlthang13 của bảng A vào cột Thuong8 của bảng B theo Thang và Sthe (Những người có cung Sthe thì mới Copy, của tháng nào thì copy tháng đó).
Minh loay hoay mãi mà ko được.
Các bạn giúp mình nha. Thank you very much!

select B
Go top
Do while !Eof()
lcSThe=SThe
lnThang=Thang
Select A
Locate For SThe = lcSThe and Thang = lnThang
if found()
lnTLThang13=TLThang13
Select B
Replace thuong8 with lnTLThang13
endif
Select B
skip
Endd

hoangnnm
08-03-2011, 12:59
Thật bất hạnh là không thể xuất ra excell vì tới trên 600.000 records! nó là visial fox nên import trực tiếp vào access lại không được. không có cách nào copy - paste sao các bạn?

Làm cách 2 đi bạn...

thichmbbg
08-03-2011, 14:57
select B
Go top
Do while !Eof()
lcSThe=SThe
lnThang=Thang
Select A
Locate For SThe = lcSThe and Thang = lnThang
if found()
lnTLThang13=TLThang13
Select B
Replace thuong8 with lnTLThang13
endif
Select B
skip
Endd

Thank bạn darshana! Minh làm theo hướng dẫn của bạn nhưng vẫn không được.
Khi chạy chương trình nó replace mãi mà không thấy dừng lại bạn ah. Bạn xem lại giúp mình nha. 2 bảng của mình có khoảng 300 bản ghi.
Ah bạn xem giúp mình cụ thể luôn mình chỉ cần copy giá trị tlthang13 (Bảng A) vào Thuong8 (Bảng B) của tháng 1 thôi. Bạn cố gắng giúp mình nhé. Thank you!

hoangnnm
08-03-2011, 15:28
Minh đang là quen với VFP nên chưa biết nhiều về nó lắm. Bạn có thể giúp mình chút được ko?
Chả là thế này: Mình có 2 bảng Bảng A: Donvi,Hoten,Sthe,thang,tlthang13
Bảng B: Donvi, Hoten, Sthe, thang, thuong8
Mình muốn Copy giá trị của Cột tlthang13 của bảng A vào cột Thuong8 của bảng B theo Thang và Sthe (Những người có cung Sthe thì mới Copy, của tháng nào thì copy tháng đó).
Minh loay hoay mãi mà ko được.
Các bạn giúp mình nha. Thank you very much!


Use A in 0 alias aliasA
Use B in 0 alias aliasB

Select aliasA
Index on alltrim(Sthe)+[-]+alltrim(str(thang)) tag stt

Select aliasB
Set Relation to alltrim(Sthe)+[-]+alltrim(str(thang)) into aliasA
Replace thuong8 with aliasA.tlthang13 for !eof([aliasA])
Set Releation off into aliasA

Use in aliasA
Use in aliasB

Character
08-03-2011, 15:36
Minh đang là quen với VFP nên chưa biết nhiều về nó lắm. Bạn có thể giúp mình chút được ko?
Chả là thế này: Mình có 2 bảng Bảng A: Donvi,Hoten,Sthe,thang,tlthang13
Bảng B: Donvi, Hoten, Sthe, thang, thuong8
Mình muốn Copy giá trị của Cột tlthang13 của bảng A vào cột Thuong8 của bảng B theo Thang và Sthe (Những người có cung Sthe thì mới Copy, của tháng nào thì copy tháng đó).
Minh loay hoay mãi mà ko được.
Các bạn giúp mình nha. Thank you very much!

Tôi xin mạn phép Bạn Darshana, mượn đoạn Code của Bạn chỉnh sửa một chút, không biết giúp gì cho bạn Thichmbbg được không, nếu không đúng bạn Thichmbbg cho biết nhé!

Select B
Go top
Scan
lcSThe=SThe
lnThang=Thang
Select A
Go top
Locate For SThe = lcSThe and Thang = lnThang
If found()
lnTLThang13=TLThang13
Select B
Replace thuong8 with lnTLThang13
Endif
Select B
Ends

Xin chào

thichmbbg
08-03-2011, 16:07
Use A in 0 alias aliasA
Use B in 0 alias aliasB

Select aliasA
Index on alltrim(Sthe)+[-]+alltrim(str(thang)) tag stt

Select aliasB
Set Relation to alltrim(Sthe)+[-]+alltrim(str(thang)) into aliasA
Replace thuong8 with aliasA.tlthang13 for !eof([aliasA])
Set Releation off into aliasA

Use in aliasA
Use in aliasB


Mình đã thử nhưng kết quả thế này bạn ơi..
Index on alltrim(Sthe)+[-]+alltrim(str(thang)) tag stt
Set Relation to alltrim(Sthe)+[-]+alltrim(str(thang)) into aliasA
=====> lỗi Function argument value, type or count is invalid
BẠN LẠI XEM GIÚP MÌNH..THANK!

hoangnnm
08-03-2011, 16:19
Mình đã thử nhưng kết quả thế này bạn ơi..
Index on alltrim(Sthe)+[-]+alltrim(str(thang)) tag stt
Set Relation to alltrim(Sthe)+[-]+alltrim(str(thang)) into aliasA
=====> lỗi Function argument value, type or count is invalid
BẠN LẠI XEM GIÚP MÌNH..THANK!

Đó là do mình nghĩ rằng trường sThe của bạn là kiểu Char và trường thang là kiểu Numeric.
Nếu trường tháng của bạn cũng là kiểu char thì như thế này :


Index on alltrim(Sthe)+[-]+alltrim(thang) tag stt

Nếu trường sThe và thang của bạn là kiểu numeric :


Index on alltrim(str(Sthe))+[-]+alltrim(str(thang)) tag stt

fanvsf
08-03-2011, 16:45
Thank bạn darshana! Minh làm theo hướng dẫn của bạn nhưng vẫn không được.

Khi chạy chương trình nó replace mãi mà không thấy dừng lại bạn ah. Bạn xem lại giúp mình nha. 2 bảng của mình có khoảng 300 bản ghi.
Ah bạn xem giúp mình cụ thể luôn mình chỉ cần copy giá trị tlthang13 (Bảng A) vào Thuong8 (Bảng B) của tháng 1 thôi. Bạn cố gắng giúp mình nhé. Thank you!

Nếu dùng Vòng lặp Do while ........ Enddo thì không cần dùng lệnh SKIP
Bạn bỏ lệnh SKIP đi là sẽ chạy được. Lệnh SKIP dùng cho vòng lặp FOR ...ENDFOR

Theo mình bây giờ không nên dùng vòng lặp DO WHILE ... ENDDO nữa mà nên dùng vòng lặp FOR i=1 to RECC() ..... ENDFOR hoặc SCAN .... ENDSCAN thì hay hơn
300 bản ghi chạy mất mấy giây thôi bạn à

Đoạn code trên mình xin sửa lại như thế này nhé
select B
Go top
FOR i =1 to RECC()
lcSThe=SThe
lnThang = 1
Select A
Locate For SThe = lcSThe and Thang = lnThang
if found()
lnTLThang13=TLThang13
Select B
Replace thuong8 with lnTLThang13 FOR thang = lnThang (Chỉ repl dữ liệu tháng 1)
ELSE
endif
Select B
skip
ENDFOR

[=========> Bổ sung bài viết <=========]


Thật bất hạnh là không thể xuất ra excell vì tới trên 600.000 records! nó là visial fox nên import trực tiếp vào access lại không được. không có cách nào copy - paste sao các bạn?

Bạn không thể Link trực tiếp từ dữ liệu FOXPRO. Bạn nên dùng ODBC để kết nối thì hay nhất. Còn với 600.000 bản ghi mà dùng thủ công copy paste thì e rằng không ổn lắm
Bạn tham khảo ở đây nhé
http://support.microsoft.com/kb/824264
Chúc bạn thành công

Lão Trư
08-03-2011, 18:43
Nếu dùng Vòng lặp Do while ........ Enddo thì không cần dùng lệnh SKIP
Bạn bỏ lệnh SKIP đi là sẽ chạy được. Lệnh SKIP dùng cho vòng lặp FOR ...ENDFOR


Chào các bro, mình là mem mới, mình chỉ mới xem được vài trang cuối, thấy VFP quá hay, mình đang lẩn quẩn tìm hiểu cái vòng lặp do while, tình cờ đọc thấy bro fanvsf có nêu:

Nếu dùng Vòng lặp Do while ........ Enddo thì không cần dùng lệnh SKIP

Có nghĩa là sao, mình chưa hiểu lắm, vòng lặp Do while … Enddo có tự động đưa con trỏ xuống bản ghi kế tiếp không?, vì mình thấy một vài nơi họ có dùng lệnh skip trong vòng lặp này để đưa con trỏ xuống bản ghi kế tiếp, như vậy là đưa con trỏ xuống thêm 01 bản ghi nữa phải không?. Nhờ các bro giải thích cho mình với, mình cám ơn trước.

hoangnnm
08-03-2011, 20:32
Chào các bro, mình là mem mới, mình chỉ mới xem được vài trang cuối, thấy VFP quá hay, mình đang lẩn quẩn tìm hiểu cái vòng lặp do while, tình cờ đọc thấy bro fanvsf có nêu:

Nếu dùng Vòng lặp Do while ........ Enddo thì không cần dùng lệnh SKIP

Có nghĩa là sao, mình chưa hiểu lắm, vòng lặp Do while … Enddo có tự động đưa con trỏ xuống bản ghi kế tiếp không?, vì mình thấy một vài nơi họ có dùng lệnh skip trong vòng lặp này để đưa con trỏ xuống bản ghi kế tiếp, như vậy là đưa con trỏ xuống thêm 01 bản ghi nữa phải không?. Nhờ các bro giải thích cho mình với, mình cám ơn trước.

@Lão Trư :
- Mình không rõ bạn có thật là "new to vfp" hay không nhưng cũng xin trả lời .
- Những gì fanvsf nói đều là "tầm bậy", ai nghe người đó chết :) .
- Ngoại trừ vòng lặp scan/endscan, nếu muốn di chuyển con trỏ bắt buộc phải dùng 1 trong 2 lệnh : Skip hoặc Go .
- Nhân đây cũng xin nhắc bạn fanvsf , nếu bạn chưa nắm rõ 1 vấn đề gì thì không nên phát biểu như vậy, có thể sẽ làm người khác mất căn bản như bạn thì tai hại lắm.

Lão Trư
08-03-2011, 21:50
Chào bạn Hoangnnm

… mình hiểu rồi, mình còn phải học tập các bạn nhiều, mình đang tập viết code ít, đơn giản, trình bày dễ hiểu, ít loằng ngoằng, đỡ rối rắm, có hiệu quả. Ngán code nhiều, phức tạp, dễ sơ suất, nhầm lẫn mà hiệu quả cũng thế. Cám ơn bạn.

khzaof
08-03-2011, 23:04
Chào mọi người ,mình mới làm quen món foxpro này .Mình có vài câu hỏi ,mong mọi người giúp mình .Hình Form
http://cB1.upanh.com/19.872.26729190.Yq30/untitled.jpg
Miêu tả hình trên :ta nhập số công đoạn ,mỗi công đoạn có đơn giá và số lượng riêng .click vào nút nhap để tiếp tục vs các công đoạn tiếp theo .
-nút tongtien: tính tổng rùi trả kết quả vào text2 bằng đơn giá * số lượng của từng công đoạn .

Mọi người giúp mình với .Thanks
Ps:Mọi người biết cách sửa caption của form cho nó hiển thị tiếng việt cho mình với .Mình đang dùng font :vk sans serif và dùng bảng mã TCVN3 .

thichmbbg
09-03-2011, 08:42
Tôi xin mạn phép Bạn Darshana, mượn đoạn Code của Bạn chỉnh sửa một chút, không biết giúp gì cho bạn Thichmbbg được không, nếu không đúng bạn Thichmbbg cho biết nhé!

Select B
Go top
Scan
lcSThe=SThe
lnThang=Thang
Select A
Go top
Locate For SThe = lcSThe and Thang = lnThang
If found()
lnTLThang13=TLThang13
Select B
Replace thuong8 with lnTLThang13
Endif
Select B
Ends

Xin chào

@Character:
Mình làm lại theo code của bạn những KQ vẫn chưa đúng.
Nó lấy luôn giá trị tlthang13 (Bảng A) của người đầu tiên gán luôn cho tất cả những người ở cột thuong8 (Bảng B); Cột Sthe thì nó chuyển về là 0 hết.hic Cao thủ giúp mình với nha. Cám ơn các bạn đã nhiệt tình chỉ bảo.
KQ Bảng B:
THANG STHE HTEN THUONG
1 0 Nguyễn Thanh Bân 14516305
1 0 Nguyễn Duy Trường 14516305
1 0 Hoàng quý luận 14516305
1 0 Nguyễn Thanh Tú 14516305
1 0 Nguyễn Trần Bảo 14516305
1 0 Lê Bảo Định 14516305
...

luu_luu
09-03-2011, 08:42
Chào mọi người ,mình mới làm quen món foxpro này .Mình có vài câu hỏi ,mong mọi người giúp mình .Hình Form
http://cB1.upanh.com/19.872.26729190.Yq30/untitled.jpg
Miêu tả hình trên :ta nhập số công đoạn ,mỗi công đoạn có đơn giá và số lượng riêng .click vào nút nhap để tiếp tục vs các công đoạn tiếp theo .
-nút tongtien: tính tổng rùi trả kết quả vào text2 bằng đơn giá * số lượng của từng công đoạn .

Mọi người giúp mình với .Thanks
Ps:Mọi người biết cách sửa caption của form cho nó hiển thị tiếng việt cho mình với .Mình đang dùng font :vk sans serif và dùng bảng mã TCVN3 .

caption tiếng Việt:phải chuột vào chỗ trống trên màn hình-properties-Appearance-advanced-active title bar=chọn font mà bạn thích, ở đây bạn có thể thiết lập các lực chọn khác như cho tool tips text, messagebox

[=========> Bổ sung bài viết <=========]


Minh đang là quen với VFP nên chưa biết nhiều về nó lắm. Bạn có thể giúp mình chút được ko?
Chả là thế này: Mình có 2 bảng Bảng A: Donvi,Hoten,Sthe,thang,tlthang13
Bảng B: Donvi, Hoten, Sthe, thang, thuong8
Mình muốn Copy giá trị của Cột tlthang13 của bảng A vào cột Thuong8 của bảng B theo Thang và Sthe (Những người có cung Sthe thì mới Copy, của tháng nào thì copy tháng đó).
Minh loay hoay mãi mà ko được.
Các bạn giúp mình nha. Thank you very much!

chú ý nếu thang và sthe đều có kiểu là C, nếu thang kiểu là N phải dùng hàm allt(STR(thang))

use tta in 1 alias a
use ttb in 2 alia b
sele a
inde on allt(thang)+allt(sthe) to idx1
sele b
inde on allt(thang)+allt(sthe) to idx2
set relation to allt(thang)+allt(sthe) into a
replacement all thuong8 with a.tlthang13
set relation to

Character
09-03-2011, 09:27
Gửi bạn Thichmbbg

Tôi hình dung được trở ngại trong đoạn Code đó của bạn rồi, do Tôi chỉ chú ý khắc phục lỗi vòng lặp mà bạn nêu trước đó mà thôi. Bạn dùng các đoạn Code của các bạn khác vừa hướng dẫn sau, ngắn gọn hiệu quả đó, tôi nghĩ là được. Còn nếu chưa đúng ý chỗ nào nữa, bạn cho Tôi biết thêm kiểu dữ liệu các field (trường) như là Sthe, Thang, TLThang13 … (để tránh chương trình báo lỗi không hợp kiểu dữ liệu trong bảng các table của bạn) và kể cả những gì cần thiết khác trong chương trình bạn (nếu có), Tôi viết mới đoạn Code khác giúp bạn, đơn giản bạn à!.

thichmbbg
09-03-2011, 09:58
Gửi bạn Thichmbbg

Tôi hình dung được trở ngại trong đoạn Code đó của bạn rồi, do Tôi chỉ chú ý khắc phục lỗi vòng lặp mà bạn nêu trước đó mà thôi. Bạn dùng các đoạn Code của các bạn khác vừa hướng dẫn sau, ngắn gọn hiệu quả đó, tôi nghĩ là được. Còn nếu chưa đúng ý chỗ nào nữa, bạn cho Tôi biết thêm kiểu dữ liệu các field (trường) như là Sthe, Thang, TLThang13 … (để tránh chương trình báo lỗi không hợp kiểu dữ liệu trong bảng các table của bạn) và kể cả những gì cần thiết khác trong chương trình bạn (nếu có), Tôi viết mới đoạn Code khác giúp bạn, đơn giản bạn à!.

Bạn Character ơi cho mình xin địa chỉ mail của bạn mình gửi 2 file.dbf đó bạn xem rồi giúp mình với. Mình mới làm quen với VFP nên trình độ còi lắm.
Gửi cho mình địa chỉ mail của bạn nha.
Email của mình: Trung121202@gmail.com

fanvsf
09-03-2011, 10:23
@Lão Trư :
- Mình không rõ bạn có thật là "new to vfp" hay không nhưng cũng xin trả lời .
- Những gì fanvsf nói đều là "tầm bậy", ai nghe người đó chết :) .
- Ngoại trừ vòng lặp scan/endscan, nếu muốn di chuyển con trỏ bắt buộc phải dùng 1 trong 2 lệnh : Skip hoặc Go .
- Nhân đây cũng xin nhắc bạn fanvsf , nếu bạn chưa nắm rõ 1 vấn đề gì thì không nên phát biểu như vậy, có thể sẽ làm người khác mất căn bản như bạn thì tai hại lắm.

Thành thật xin lỗi mọi người. Sai lầm tai hại, có thể do lâu ngày mình không dùng đến vòng lặp DO WHILE ... ENDDO
Cám ơn bạn hoangnnm đã chỉ bảo

Character
09-03-2011, 11:08
Bạn Character ơi cho mình xin địa chỉ mail của bạn mình gửi 2 file.dbf đó bạn xem rồi giúp mình với. Mình mới làm quen với VFP nên trình độ còi lắm.
Gửi cho mình địa chỉ mail của bạn nha.
Email của mình: Trung121202@gmail.com

Chào bạn Thichmbbg

Tôi đã gửi rồi. Bạn mở Email của bạn để xem.

Character.

thichmbbg
09-03-2011, 11:24
Chào bạn Thichmbbg

Tôi đã gửi rồi. Bạn mở Email của bạn để xem.

Character.

Thank Character! Mình gửi file cho bạn rồi đó, bạn xem rồi giúp mình nhé.

Character
09-03-2011, 13:57
Gửi bạn Thichmbbg

Tôi đã gửi Bạn đoạn code mới. Bạn mở Email của bạn để xem. Hy vọng giúp được chút gì cho Bạn.
Chúc thành công.

Chào bạn
Character

khzaof
09-03-2011, 21:03
caption tiếng Việt:phải chuột vào chỗ trống trên màn hình-properties-Appearance-advanced-active title bar=chọn font mà bạn thích, ở đây bạn có thể thiết lập các lực chọn khác như cho tool tips text, messagebox


Thanks bạn nhá ,bạn giúp mình trên win 7 với .

Ps :giúp mình bài kia với :punk:

luu_luu
10-03-2011, 09:02
Thanks bạn nhá ,bạn giúp mình trên win 7 với .

Ps :giúp mình bài kia với :punk:

phải chuột trên màn hình - window color - active title bar

[=========> Bổ sung bài viết <=========]


Chào mọi người ,mình mới làm quen món foxpro này .Mình có vài câu hỏi ,mong mọi người giúp mình .Hình Form
http://cB1.upanh.com/19.872.26729190.Yq30/untitled.jpg
Miêu tả hình trên :ta nhập số công đoạn ,mỗi công đoạn có đơn giá và số lượng riêng .click vào nút nhap để tiếp tục vs các công đoạn tiếp theo .
-nút tongtien: tính tổng rùi trả kết quả vào text2 bằng đơn giá * số lượng của từng công đoạn .

Mọi người giúp mình với .Thanks
Ps:Mọi người biết cách sửa caption của form cho nó hiển thị tiếng việt cho mình với .Mình đang dùng font :vk sans serif và dùng bảng mã TCVN3 .

- nhap.click
insert into (ten table) (tên trường công đoạn,tên đơn giá,tên số lượng) VALUES (thisform.text1.Value,thisform.text3.Value,thisfor m.text4.Value)
* bạn có thể tính tổng ở đây tùy ý
thisform.text2.Value=thisform.text3.Value*thisform .text4.Value


- tongtien.click
thisform.text2.Value=thisform.text3.Value*thisform .text4.Value

duonglx
10-03-2011, 14:21
Hi các Pro
Mình là lính mới, mong các pro chỉ giúp
Hiện tại minh dang nghiên cứu thằng Fast 2001 viet tren nền foxpro 6.0
Có 1 số form nhập liệu hiện giờ chỉ cho nhập 6 ký tự, nhưng mình muốn chỉnh thành nhập 8 ký tự.
Hiện giờ mình ko biết cách mở riêng cái form đó lên để chỉnh thế nào và chỉnh sao cho ko bị lỗi.
Các bạn giúp mình với.

luu_luu
10-03-2011, 14:31
Hi các Pro
Mình là lính mới, mong các pro chỉ giúp
Hiện tại minh dang nghiên cứu thằng Fast 2001 viet tren nền foxpro 6.0
Có 1 số form nhập liệu hiện giờ chỉ cho nhập 6 ký tự, nhưng mình muốn chỉnh thành nhập 8 ký tự.
Hiện giờ mình ko biết cách mở riêng cái form đó lên để chỉnh thế nào và chỉnh sao cho ko bị lỗi.
Các bạn giúp mình với.

trước tiên bạn phải copy toàn bộ ra một hay hai bản lưu vào thư mục khác để đề phòng. bạn phải cho biết chính xác form nào ứng với table nào

duonglx
10-03-2011, 15:08
trước tiên bạn phải copy toàn bộ ra một hay hai bản lưu vào thư mục khác để đề phòng. bạn phải cho biết chính xác form nào ứng với table nào
Form nhập chứng từ tạm ứng. Nó sẽ chuyển vào 1 file tạm 2_phtmp. Sau đó dữ liệu nó phân về nhiều file khác nữa. Điển hình là dmct.dbf, ph1111.dbf, ct1111.dbf.
Bạn giúp mình với.
Mình tạo sẵn mấy bản để backup rồi

gianglangtukg
10-03-2011, 18:26
Set talk off
Set Bell on
Set date to DMY
Set Stat Off

SELE 1
USE nguoidung
LOCATE FOR UPPER(ALLTRIM(ten))=UPPER(ALLTRIM(thisform.text1. Value)) AND UPPER(ALLTRIM(matkhau))=UPPER(ALLTRIM(thisform.tex t2.Value ))
IF FOUND() then
do FORM giaodien.scx
thisform.Release

cho mình hỏi ý nghĩa của những lệnh này với
Set talk off : làm cho chương trình chạy nhanh hơn phải k?
Set Bell on : này tác dụng gj?
Set date to DMY: định dạng ngày tháng năm
Set Stat Off: này hok biết?

SELE 1 : này cũng hok biết

chỉ giúp với các pác

Lão Trư
10-03-2011, 21:01
Set talk off
Set Bell on
Set date to DMY
Set Stat Off

SELE 1
USE nguoidung
LOCATE FOR UPPER(ALLTRIM(ten))=UPPER(ALLTRIM(thisform.text1. Value)) AND UPPER(ALLTRIM(matkhau))=UPPER(ALLTRIM(thisform.tex t2.Value ))
IF FOUND() then
do FORM giaodien.scx
thisform.Release

cho mình hỏi ý nghĩa của những lệnh này với
Set talk off : làm cho chương trình chạy nhanh hơn phải k?
Set Bell on : này tác dụng gj?
Set date to DMY: định dạng ngày tháng năm
Set Stat Off: này hok biết?

SELE 1 : này cũng hok biết

chỉ giúp với các pác

Chào bạn gianglangtukg

Bất kỳ khi viết chương trình nào, vấn đề đầu tiên ta phải tìm hiểu, trang bị thật vững kiến thức lý thuyết trước thì mới khả dĩ viết chương trình ít bị bí rị, ít bị lỗi (cú pháp, logic …).

Câu hỏi của bạn thuộc về giáo trình lý thuyết FoxPro, nên cố gắng tìm đọc tài liệu hoặc mở xem phần Help của VFP (sau khi khởi động VFP, bấm phím F1, màn hình tra cứu hiện ra, bạn tha hồ tham khảo, có điều vốn tiếng Anh phải tương đối).

Tôi trả lời ngắn gọn các thắc mắc bạn nêu:

1-Một số lệnh thiết lập môi trường: (Có rất nhiều lênh SET …. Ta chỉ cần khai báo một số lệnh cần thiết tại vị trí đầu tiên khi khởi động chương trình mà thôi. Ở đây bạn khai báo trước khi khởi động giao diện chính <do FORM giaodien.scx>).

SET TALK ON/OFF && Hiển thị hoặc không hiển thị trên màn hình kết quả lệnh đang thực hiện.
SET BELL ON/OFF && Bật/Tắt âm thanh (tiếng Bíp cảnh báo ví dụ khi có lỗi xảy ra…)
SET CURSOR ON/OFF && Hiển thị hoặc không hiển thị con trỏ.
SET STATUS ON/OFF && Hiển thị hoặc không hiển thị dòng trạng thái (dòng dưới đáy màn hình).
SET DATE DMY && Thiết lập ngày theo kiểu thứ tự ngày, tháng, năm (DD/MM/YY).
SET CENTURY ON/OFF && Hiển thị hoặc không hiển thị số thế kỷ (ví dụ số 20 của 2011).
SET DELETE ON/OFF && Không hiển thị hoặc hiển thị bản ghi đã đánh dấu xoá.
SET EXACT ON/OFF && Mở/Tắt so sánh chính xác 02 chuỗi ký tự (ví du mật mã…).
SET EXCLUSIVE ON/OFF && Mở/Tắt bảng ở chế độ độc quyền.
…………………..
(còn rất nhiều lệnh SET khác nữa...).

2-Vùng làm việc (SELECT):
Là vùng ký ức được mở để đưa vào bộ nhớ các bảng Table khác nhau, chờ người dùng phát lệnh truy xuất, cập nhật dữ liệu trong bảng. (Có thể chọn Số 1, 2, 3 … hoặc ký tự A, B, C …). Đây là vấn đề quan trọng cần nắm vững khi chương trình cần làm việc với nhiều bảng Table.

Ví dụ:
SELECT 1 && hoặc SELE A là mở bảng table vùng số 1 hoặc vùng A (đầu tiên)
Use TABLE1
SELECT 2 && hoặc SELE B là mở bảng table vùng số 2 hoặc vùng B
Use TABLE2
SELECT 3 && tương tự vùng 3 (vùng C)
Use TABLE3
SELECT 0 && mở vùng trống tiếp theo (vùng 4 hoặc vùng D)
Use TABLE4
SELECT 0 && mở vùng trống nữa tiếp theo (vùng 5 hoặc vùng E)
Use TABLE5
…………………

Khi đã khai báo như trên rồi thì sau đó, nếu cần làm việc với bảng Table nào thì chỉ cần gọi vùng làm việc là đủ, chương trình sẽ tự kích hoạt bảng table trong vùng làm việc đó làm bảng hiện hành.

Hai lệnh dưới đây là khai báo (vào bộ nhớ) bảng NGUOIDUNG.DBF được mở tại vùng làm việc số 1 (vùng A).

SELE 1 && VFP cho phép viết 04 ký tự đầu của mỗi từ khoá (VD: SELECT thì viết SELE là đủ).
USE nguoidung

Nếu đã khai báo một vùng làm việc, có kèm lệnh mở bảng nào đó rồi mà sau đó chưa đóng bảng (lệnh USE không có tên bảng đi kèm là đóng bảng hiện hành), lại có lệnh mở bảng đó nữa thì chương trình dễ bị gây lỗi.

Bạn lưu ý xem, khắc phục lỗi Logic này trong đoạn Code của bạn:

Tình huống người dùng nhập không đúng mật mã, phải nhập lại mật mã lần sau (rất dễ xảy ra), thì đoạn Code này thi hành lần nữa lệnh mở bảng NGUOIDUNG.DBF:

USE NGUOIDUNG

Có nghĩa là bảng NGUOIDUNG.DBF lại có lệnh mở nữa trong khi bảng này đã mở lần trước rồi, nhưng chưa đóng, nên sẽ gây lỗi chương trình.

Để khắc phục lỗi này, Tôi gợi ý đề xuất:
Thông thường ta khai báo tại Procedure Load của Form hai lệnh này:

SELE 1
USE nguoidung

Trong đoạn Code trên, không dùng lệnh mở bảng nữa, mà chỉ khai báo vùng làm việc là đủ (chương trình sẽ kích hoạt bảng Table NGUOIDUNG.DBF làm bảng hiện hành:

SELE 1
USE nguoidung && Xoá dòng này do khai báo tại Procedure Load rồi
Go Top && thêm mới để chương trình trở lại tìm Tên người dùng, mật mã từ bản ghi đầu.

3- Khi trình bày, Bạn nên thêm vào đoạn code từ Endif sau dòng Thisform.Release là:

Thisform.Release
………
Endif && thêm mới để hiển thị rõ cho người xem biết việc kết thúc cấu trúc điều khiển If …. Endif


Chào bạn.

luu_luu
11-03-2011, 07:37
Form nhập chứng từ tạm ứng. Nó sẽ chuyển vào 1 file tạm 2_phtmp. Sau đó dữ liệu nó phân về nhiều file khác nữa. Điển hình là dmct.dbf, ph1111.dbf, ct1111.dbf.
Bạn giúp mình với.
Mình tạo sẵn mấy bản để backup rồi

có 2 việc phải làm:
1. kiểm tra file DBF xem độ rộng của field đó có chấp nhận 8 ký tự không? nếu không thì phải thay đổi độ rộng của nó = lệnh
USE filename.dbf
MODIFY STRUCTURE
2. mở form nhập liệu, chọn textbox - phải chuột-properties-InputMask=******XX
bạn chú ý, nếu đổi độ rộng của file tạm, thì phải đổi độ rộng của các file nhận dữ liệu từ file tạm, nếu không khi bạn nhập 8 ký tự, dữ liệu chuyển sang các file liên quan mà bạn không thay đổi độ rộng thì số liệu chỉ nhận được 6 ký tự,OK

Parker Pen
12-03-2011, 18:56
... Mình muốn in mấy cái biểu đồ ra giấy để báo cáo cho sếp. Nhưng mà report trong fox lại không hỗ trợ về biểu đồ... có cách nào ko hả bạn ? ...

Gửi bạn Sweetboy2805

Không biết bạn đã có cách nào giải quyết được vấn đề của bạn nêu trên chưa? Nếu Bạn chưa tìm được cách giải quyết nào tốt hơn, Tôi thấy bạn Tayngangvfp có viết chương trình biểu diễn số liệu thành dạng đồ thị (Chart) hiển thị trên Form, cũng như xuất ra Report rất tốt đó. Nếu cần, Bạn có thể tham khảo cách này của bạn Tayngangvfp tại link:

http://www.mediafire.com/file/9ad49x2a3e2ela1/dothi.rar

Chào bạn.
Parker Pen

oco
14-03-2011, 22:02
Chào các Bác. Em mới học Foxpro, chưa học gì về lập trình cả, chỉ làm mấy bài toán From, report, query, menu thôi.
Em làm bài trên máy rồi cóp sang máy khác thì không chạy được, em cũng đã đọc mấy bài các bác chỉ cách khắc phục. Nhưng mới tiếp xúc em cũng không hiểu lắm. Mong các bác chỉ bảo từng bước hộ em với (cóp py mấy file đó từ đâu vào đâu để chạy được ở máy khác ạ, vì em chưa cài VFF)
Cảm ơn các Bác nhiều

luu_luu
15-03-2011, 07:35
Chào các Bác. Em mới học Foxpro, chưa học gì về lập trình cả, chỉ làm mấy bài toán From, report, query, menu thôi.
Em làm bài trên máy rồi cóp sang máy khác thì không chạy được, em cũng đã đọc mấy bài các bác chỉ cách khắc phục. Nhưng mới tiếp xúc em cũng không hiểu lắm. Mong các bác chỉ bảo từng bước hộ em với (cóp py mấy file đó từ đâu vào đâu để chạy được ở máy khác ạ, vì em chưa cài VFF)
Cảm ơn các Bác nhiều

copy tất cả file *.dll vào thư mục WINDOWS\SYSTEM32
- file DLL
msvcp71.dll
msvcr71.dll
msvcr70.dll
- nếu bạn dùng fox 7
vfp7enu.dll
vfp7r.dll
vfp7renu.dll
- nếu bạn dùng fox 9
vfp9enu.dll
vfp9r.dll
vfp9renu.dll

Character
15-03-2011, 15:40
Gửi bạn Tayngangvfp

Cám ơn Bạn, nhờ chương trình mẫu của Bạn và sự giới thiệu của Parker Pen trên DDTH, tôi và một số bạn khác có tìm hiểu và thực hiện thành công xuất dữ liệu thành dạng biểu đồ trên Form, xuất ra Report và Word rất chuẩn, rất đẹp. Cám ơn các bạn rất nhiều.

Xin chào
Character

tpftobor
18-03-2011, 16:54
Có bạn nào biết các tạo và sử dụng file có đuôi là *.Fll không (Foxpro Dinamic Link Library) không xin chỉ giáo. Nếu có demo thì tốt quá. Thanks!

tayngangvfp
18-03-2011, 17:31
Có bạn nào biết các tạo và sử dụng file có đuôi là *.Fll không (Foxpro Dinamic Link Library) không xin chỉ giáo. Nếu có demo thì tốt quá. Thanks!

Sử dụng file FLL rất đơn giản, VD trong thư mục cài đặt VFP thường kèm theo file: Foxtools.fll. Trong file này có nhiều hàm mà ta có thể sử dụng:
MSGBOX(<ExpC1>, <ExpC2>, <ExpN>),.......

Khi đó để sử dụng hàm này, chỉ việc khai báo:

SET LIBRARY TO "foxtools.fll" <ADDITIVE>

Rồi sử dụng hàm như sau:

MSGBOX("Hello!", "Msg Caption", 0)

tpftobor
19-03-2011, 08:40
Sử dụng file FLL rất đơn giản, VD trong thư mục cài đặt VFP thường kèm theo file: Foxtools.fll. Trong file này có nhiều hàm mà ta có thể sử dụng:
MSGBOX(<ExpC1>, <ExpC2>, <ExpN>),.......

Khi đó để sử dụng hàm này, chỉ việc khai báo:

SET LIBRARY TO "foxtools.fll" <ADDITIVE>

Rồi sử dụng hàm như sau:

MSGBOX("Hello!", "Msg Caption", 0)

Tks tayngangvfp

Cho mình hỏi thêm:
- Cách tạo file *.fll?
- Có cách nào để list ra những hàm và các tham số của hàm đó trong fll không?

tayngangvfp
21-03-2011, 11:02
Tks tayngangvfp

Cho mình hỏi thêm:
- Cách tạo file *.fll?
- Có cách nào để list ra những hàm và các tham số của hàm đó trong fll không?

1/Thường dùng C(+/++/Visual C).
2/Mình ko biết

sherk105
21-03-2011, 13:36
Mình muốn học Visual Fox từ căn bản đến nâng cao, nhờ các bạn tư vấn cho mình học ở đâu hoặc sách nào để mình có thể tự học đc..

rất mong các bạn giúp mình.
Mình ở TPHCM .

Thaks .... Call 0908 741 760

luu_luu
21-03-2011, 13:42
Mình muốn học Visual Fox từ căn bản đến nâng cao, nhờ các bạn tư vấn cho mình học ở đâu hoặc sách nào để mình có thể tự học đc..

rất mong các bạn giúp mình.
Mình ở TPHCM .

Thaks .... Call 0908 741 760

sử dụng & khai thác microsoft visual foxpro 6.0 do Nguyễn Ngọc Minh chủ biên xuất bản năm 2000, cuốn này là chi tiết từ căn bản đến nâng cao.

hung_public
22-03-2011, 15:19
Hi all!
Tôi mới gia nhập diễn đàn này, hôm nay mới biết là vẫn còn nhiều người dùng Fox đến vậy.
Tôi bắt đầu làm quen với Fox từ những năm 2000, tôi thấy ngôn ngữ này rất hay nhưng do điều kiện và môi trường không tiếp xúc nhiều nên cũng không nghiên cứu sâu về Fox lắm.
Tôi có một vấn đề muốn nhờ các bạn giải đáp và giúp đỡ, đó là tôi có một số mẫu hợp đồng trên file Word (file này đã merge với 1 file Excel), giờ muốn nhập dữ liệu vào Fox để mối khi bấm nút in, thông tin về bản ghi hiện tại sẽ được điền sang file Word kia, giống như merge từ dữ liệu excel vậy.

tayngangvfp
23-03-2011, 09:11
Hi all!
Tôi mới gia nhập diễn đàn này, hôm nay mới biết là vẫn còn nhiều người dùng Fox đến vậy.
Tôi bắt đầu làm quen với Fox từ những năm 2000, tôi thấy ngôn ngữ này rất hay nhưng do điều kiện và môi trường không tiếp xúc nhiều nên cũng không nghiên cứu sâu về Fox lắm.
Tôi có một vấn đề muốn nhờ các bạn giải đáp và giúp đỡ, đó là tôi có một số mẫu hợp đồng trên file Word (file này đã merge với 1 file Excel), giờ muốn nhập dữ liệu vào Fox để mối khi bấm nút in, thông tin về bản ghi hiện tại sẽ được điền sang file Word kia, giống như merge từ dữ liệu excel vậy.

Gửi bạn 1 ví dụ tham khảo:
http://www.mediafire.com/file/0btoh51ck04yrp9/MailMerge.rar

hung_public
23-03-2011, 11:23
Gửi bạn 1 ví dụ tham khảo:
http://www.mediafire.com/file/0btoh51ck04yrp9/MailMerge.rar

Cám ơn bác tayngangvfp rất nhiều, đây đúng là cái em đang cần.
Xin hỏi thêm bác một vấn đề nữa, em nhập dữ liệu vào file bằng bảng mã TCVN3 (vì không biết lưu bằng bảng mã Unicode), giờ muốn thể hiện được dữ liệu đó trên file Word ở dạng một trong 2 bảng mã (TCVN3 hoặc Unidode) thì phải làm thế nào ạ?

tayngangvfp
23-03-2011, 11:50
Cám ơn bác tayngangvfp rất nhiều, đây đúng là cái em đang cần.
Xin hỏi thêm bác một vấn đề nữa, em nhập dữ liệu vào file bằng bảng mã TCVN3 (vì không biết lưu bằng bảng mã Unicode), giờ muốn thể hiện được dữ liệu đó trên file Word ở dạng một trong 2 bảng mã (TCVN3 hoặc Unidode) thì phải làm thế nào ạ?

1/Thể hiện = TCVN3 thì cứ xuất ra bình thường
2/Thể hiện = Unicode: bạn tham khảo cách chuyển đổi ở đây
http://vn.360plus.yahoo.com/tayngangvfp/article?mid=20

hung_public
23-03-2011, 13:57
Em nhập dữ liêụ bằng bảng mã TCVN3 nhưng xuất ra ở dạng TCVN3 vẫn bị mã hóa anh ạ, không hiểu sao?????
Nếu em muốn thể hiện bằng Unicode thì phải sửa đoạn nào trong sự kiện dưới đây để convert sang Unicode trước khi merge vào Word ạ?

_CThuMucData=_PathRoot
tDataSource=_CThuMucData+[;]
tFileName=[Data_DB4.DBF]
tName=_CThuMucData+tFileName
tConfirmConversions=0 &&.F.
tReadOnly=0 &&.F.
tLinkToSource=0 &&.F.
tAddToRecentFiles=0 &&.F.
tPasswordDocument=[]
tPasswordTemplate=[]
tWritePasswordDocument=[]
tWritePasswordTemplate=[]
tRevert=0 &&.F.
tFormat=0 &&wdOpenFormatAuto
tConnection=[Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;]+tDataSource+[Mode=Read;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB: Database Password="""";Jet OLEDB:Engine Type=18;]
tSQLStatement=[SELECT * FROM ]+[']+tFileName+[']
tSQLStatement1=[]
tSubType=1 &&wdMergeSubTypeAccess

oWord = CREATEOBJECT("Word.Application")
oWord.Documents.Open(_CThuMucData+[HDLD.Doc])
oWord.ActiveDocument.MailMerge.OpenDataSource(tNam e, tFormat, tConfirmConversions, tReadOnly, tLinkToSource, tAddToRecentFiles, tPasswordDocument, tPasswordTemplate, tRevert, tWritePasswordDocument, tWritePasswordTemplate, tConnection, tSQLStatement)
tPause=.F.
oWord.ActiveDocument.MailMerge.Execute(tPause)
oWord.Visible=.T.
*oWord.Quit
oWord=null

tronghv88
24-03-2011, 09:06
các bạn cho mình hỏi ,tạo một menu bằng cách Click chuột phải trong FoxPro.
Ví dụ Click chuột phải vào Form sẽ cho chọn in ra report hay là thoát hẳn Form đó luôn. thanks!!

Character
24-03-2011, 10:39
các bạn cho mình hỏi ,tạo một menu bằng cách Click chuột phải trong FoxPro.
Ví dụ Click chuột phải vào Form sẽ cho chọn in ra report hay là thoát hẳn Form đó luôn. thanks!!

Chào bạn Tronghv88

Ví dụ bạn chuẩn bị trước Menu tắt tên là edtshort.mpr đặt trong thư mục chương trình của Bạn (menu mẫu này có sẵn trong thư mục …\Microsoft Visual FoxPro 9\Samples\Solution\Menus\..., trong Menu đó có một vài chức năng ví dụ là Copy, Paste, Clear …)
Tại Form cần gắn Menu tắt này, nếu Bạn muốn động tác RightClick của bạn vào Form hoặc vào đối tượng điều khiển nào đó trong Form để gọi Menu tắt thi hành lệnh nào đó…, Bạn nhập tại Procedure RightClick của Form hoặc đối tượng điều khiển đó dòng lệnh sau:

Do edtshort.mpr

Chào bạn
Character

duonglx
24-03-2011, 14:55
có 2 việc phải làm:
1. kiểm tra file DBF xem độ rộng của field đó có chấp nhận 8 ký tự không? nếu không thì phải thay đổi độ rộng của nó = lệnh
USE filename.dbf
MODIFY STRUCTURE
2. mở form nhập liệu, chọn textbox - phải chuột-properties-InputMask=******XX
bạn chú ý, nếu đổi độ rộng của file tạm, thì phải đổi độ rộng của các file nhận dữ liệu từ file tạm, nếu không khi bạn nhập 8 ký tự, dữ liệu chuyển sang các file liên quan mà bạn không thay đổi độ rộng thì số liệu chỉ nhận được 6 ký tự,OK

Thank Bạn rất nhiều.
Bạn cho mình hỏi 1 câu nữa nha.
Mình muốn thay đổi giá trị mặc định cuả 1 textbox thì phải làm sao nhỉ?

luu_luu
24-03-2011, 16:12
Thank Bạn rất nhiều.
Bạn cho mình hỏi 1 câu nữa nha.
Mình muốn thay đổi giá trị mặc định cuả 1 textbox thì phải làm sao nhỉ?

- thay đổi giá trị mặc định textbox lúc thiết kế:
mở form nhập liệu, chọn textbox - phải chuột-properties-tìm khoản mục VALUE nhập vài giá trị cần thay đổi

- thay đổi giá trị mặc định textbox bằng PRO
thisform.text1.Value=giá trị mới

tayngangvfp
25-03-2011, 14:36
Em nhập dữ liêụ bằng bảng mã TCVN3 nhưng xuất ra ở dạng TCVN3 vẫn bị mã hóa anh ạ, không hiểu sao?????
Nếu em muốn thể hiện bằng Unicode thì phải sửa đoạn nào trong sự kiện dưới đây để convert sang Unicode trước khi merge vào Word ạ?

Theo M thì không dùng đoạn code đó để convert được.
Vì phần data merge là do Word mở và thực hiện.

hoangnnm
25-03-2011, 16:59
Em nhập dữ liêụ bằng bảng mã TCVN3 nhưng xuất ra ở dạng TCVN3 vẫn bị mã hóa anh ạ, không hiểu sao?????
Nếu em muốn thể hiện bằng Unicode thì phải sửa đoạn nào trong sự kiện dưới đây để convert sang Unicode trước khi merge vào Word ạ?

Mình không làm thử cái mail merge của bạn nhưng để convert từ tcvn3 sang unicode ở word rất đơn giản :


loWord.ActiveDocument.ConvertVietDoc(Code)
Trong đó Code là mã của văn bản TCVN gốc:
VNI = 1
VNU-Win = 2
VISCII = 3
VNCII = 4
ABC = 5


Hy vọng giúp được bạn .

hung_public
28-03-2011, 15:40
Theo M thì không dùng đoạn code đó để convert được.
Vì phần data merge là do Word mở và thực hiện.
Vậy có cách nào khác không bác tayngangvfp? Bác giúp em với, Em năn nỉ bác đấy!
Vấn đề của em là làm thế nào để Merge ra file Word ở dạng font Unicode được, còn vấn đề nhập dữ liệu đầu vào thì dùng bảng mã nào cũng được ạ.

Mình không làm thử cái mail merge của bạn nhưng để convert từ tcvn3 sang unicode ở word rất đơn giản. Hy vọng giúp được bạn.
Mình làm thử nhưng không được vì nó đã mang dữ liệu bị mã hoá sang file Word trước khi chuyển bạn ạ.

tayngangvfp
28-03-2011, 16:50
Vậy có cách nào khác không bác tayngangvfp? Bác giúp em với, Em năn nỉ bác đấy!
Vấn đề của em là làm thế nào để Merge ra file Word ở dạng font Unicode được, còn vấn đề nhập dữ liệu đầu vào thì dùng bảng mã nào cũng được ạ.

Mình làm thử nhưng không được vì nó đã mang dữ liệu bị mã hoá sang file Word trước khi chuyển bạn ạ.

Mình thử dùng cái hàm ConvertVietDoc với Word 2002 thì:
-Văn bản gốc = font VNI => không chuyển được, không biết tại sao?
-Văn bản gốc = font ABC => chuyển OK

Vậy giải pháp đơn giản nhất cho bạn là thiết kế file word dùng merge = ABC sau đó nhập nhập data trong fox cũng = abc. Hoặc trong Fox nhập = VNI và dùng cái tool chuyển font M viết để chuyển sang abc trước khi merge.

hung_public
28-03-2011, 18:37
Giải pháp đơn giản nhất cho bạn là thiết kế file word dùng merge = ABC sau đó nhập nhập data trong fox cũng = abc.

Bác tayngangvfp à! không hiểu tại sao em làm như bác rồi nhưng dữ liệu vẫn bị mã hoá loằng ngoằng với những chữ có dấu (sử dụng bảng mã ABC)
Em lấy ví dụ của bác về Mail Merge sau đó brow file dbf lên để nhập dữ liệu (bằng bảng mã ABC) nhưng cuối cùng kết quả vẫn lỗi bác ạ
Em nhập Nguyễn Văn A --> kết quả là Nguy?n V¿n A
Bác chỉ giúp em cách khắc phục với!

tayngangvfp
29-03-2011, 15:46
Bác tayngangvfp à! không hiểu tại sao em làm như bác rồi nhưng dữ liệu vẫn bị mã hoá loằng ngoằng với những chữ có dấu (sử dụng bảng mã ABC)
Em lấy ví dụ của bác về Mail Merge sau đó brow file dbf lên để nhập dữ liệu (bằng bảng mã ABC) nhưng cuối cùng kết quả vẫn lỗi bác ạ
Em nhập Nguyễn Văn A --> kết quả là Nguy?n V¿n A
Bác chỉ giúp em cách khắc phục với!

Không biết bạn dùng word nào, m đang dùng word 2002 nên không kiểm tra được. Bạn thử làm theo các bước sau xem (nếu dùng word 2003 -> 2007)

1/ Dùng VFP tạo mới 1 file DBF, sau đó nhập dữ liệu với font ABC
2/ Tạo 1 file word dùng để merge theo mã abc
3/ Dùng chức năng merge trong word để mở file dbf tạo ở trên để dùng làm source.
4/ Thử merge xem có ra được đúng font ABC không. Nếu được thì m sẽ viết code giúp bạn. Còn không thì sẽ tìm cách khác.

hung_public
29-03-2011, 19:18
Không biết bạn dùng word nào, m đang dùng word 2002 nên không kiểm tra được. Bạn thử làm theo các bước sau xem (nếu dùng word 2003 -> 2007)

1/ Dùng VFP tạo mới 1 file DBF, sau đó nhập dữ liệu với font ABC
2/ Tạo 1 file word dùng để merge theo mã abc
3/ Dùng chức năng merge trong word để mở file dbf tạo ở trên để dùng làm source.
4/ Thử merge xem có ra được đúng font ABC không. Nếu được thì m sẽ viết code giúp bạn. Còn không thì sẽ tìm cách khác.

Em đang dùng Word 2003, em làm các bước như bác hướng dẫn thì Ok bác ạ.
Bác nhiệt tình quá, em xem một số code của bác thấy thật khâm phục. Bác giúp em đoạn code này thì còn gì bằng.
Em cảm ơn bác trước nhé!

Thiên_Thần
30-03-2011, 08:56
các pro ơi! em muốn tạo ra thư mục động cho phép thay đổi ổ đĩa và tên thư mục thông qua 1 form và kỹ thuật sử dụng Macro. tức là khi em làm chương trình ở máy em, em copy mang sang máy khác mà nó vẫn chạy ý ak! giúp em với . Thanks!

khzaof
30-03-2011, 10:18
Hi Thanks mọi người đã giúp đỡ mình :punk:
cho mình hỏi :muốn chỉnh độ rộng của report cụ thể là tăng lên thì làm như thế nào ?

hung_public
30-03-2011, 11:16
Không biết bạn dùng word nào, m đang dùng word 2002 nên không kiểm tra được. Bạn thử làm theo các bước sau xem (nếu dùng word 2003 -> 2007)

1/ Dùng VFP tạo mới 1 file DBF, sau đó nhập dữ liệu với font ABC
2/ Tạo 1 file word dùng để merge theo mã abc
3/ Dùng chức năng merge trong word để mở file dbf tạo ở trên để dùng làm source.
4/ Thử merge xem có ra được đúng font ABC không. Nếu được thì m sẽ viết code giúp bạn. Còn không thì sẽ tìm cách khác.


Em đang dùng Word 2003, em làm các bước như bác hướng dẫn thì Ok bác ạ.
Bác nhiệt tình quá, em xem một số code của bác thấy thật khâm phục. Bác giúp em đoạn code này thì còn gì bằng.
Em cảm ơn bác trước nhé!

Sau một hồi kiểm tra em thấy như sau:
- Chương trình MailMerge hôm trước bác gửi cho em chỉ chạy được trên DBF4 thôi, vì vậy dữ liệu đưa ra vẫn bị mã hoá.
- Em chuyển sang tạo mới một CSDL và Merge bằng tay thì dữ liệu thể hiện đúng nhưng em thay vào chương trình thì code đó không tạo được kết nối giữa Word và DBF. (có nghĩa là kết nối đó chỉ làm việc với DBF4 thôi, còn file DBF tạo ra từ VFP thì không kết nối được)

Nó báo lỗi ở đoạn:
.ActiveDocument.MailMerge.OpenDataSource(dsname,wf ormat,wconfirmconv, wreadonly,wlinktosource,waddtofilelist, wpassworddoc,wpasswordtemp,wrevert,wprotectdoc, wprotecttemp,wconn,wsqlstatement)

Giờ vấn đề của em lại liên quan đến kết nối ODBC bác Tayngangvfp ạ. Bác giúp em với!
Nếu có thể bác tư vấn cho em chuyển sang một CSDL nào hỗ trợ Unicode được thì tốt nhất.

Character
30-03-2011, 12:02
Hi Thanks mọi người đã giúp đỡ mình :punk:
cho mình hỏi :muốn chỉnh độ rộng của report cụ thể là tăng lên thì làm như thế nào ?

Gửi bạn Khzaof

- Mở Report cần chỉnh:

1- Chỉnh độ rộng trang in:
Tại Menu VFP trên cùng chọn File --> Page setup … tùy chỉnh các trị số ...

2- Chỉnh độ rộng Report:
Tại Menu VFP trên cùng chọn Report --> Properties… --> thẻ trang Page layout --> Colunm --> Chỉnh trị số Spinner Width (tăng/giảm độ rộng Report).

3- Chỉnh độ rộng của Field trong Report:
- DoubleClick vào Field cần chỉnh sửa --> xuất hiện hộp thoại Field Properties;
- Tại thẻ trang General (có thể chọn một hoặc nhiều tuỳ chọn sau):
+ Trong ô tuỳ chọn Object Positions chọn option Float (khi thi hành Field tự chuyển dịch vị trí, giữ khoảng cách tương đối, phù hợp với vị trí các Field trên).
+ Đánh dấu check vào ô Stretch with overflow (Field tự chuyển dịch mở rộng chiều cao cho vừa đủ số ký tự dữ liệu của Field).
+ Tại ô Size and position in layout chỉnh lại trị số của spinner Height và spinner Width cho phù hợp (đây là độ cao, độ rộng lúc thiết kế Field này, chỉnh tùy ý).

Nếu gợi ý này không đúng ý, bạn cho biết nhé.

Chào bạn
Character

hung_public
30-03-2011, 17:38
Hôm nay bác Tayngangvfp đi đâu mà không thấy lên diễn đàn làm em mong mỏi cả mắt !!!
Em định chuyển sang hướng dùng CSDL Access để lưu dữ liệu, vì nó lưu được Unicode. Bác cho em lời khuyên liệu có nên dùng CSDL này không?
Nếu dùng CSDL này thì câu lệnh để Merge ra file Word thế nào ạ?
Rất mong bác tayngangvfp và các cao thủ khác trợ giúp em vụ này với ạ.

Fish eye
30-03-2011, 21:48
các pro ơi! em muốn tạo ra thư mục động cho phép thay đổi ổ đĩa và tên thư mục thông qua 1 form và kỹ thuật sử dụng Macro. tức là khi em làm chương trình ở máy em, em copy mang sang máy khác mà nó vẫn chạy ý ak! giúp em với . Thanks!

Môt số gợi ý gửi bạn Thiên_Thần

1- Để chọn thư mục và lấy tên đường dẫn thư mục, trong Form Bạn dùng hàm GETDIR( ), Ví dụ:

LOCAL cGetPath
cGetPath =GETDIR(Full(''), Full(''),'Chon TM du lieu',4)

Biến cGetPath nhận giá trị trả về của hàm trên, bạn sử dụng biến này vào việc cần thiết nào đó trong chương trình cuả bạn.

2-Bạn lưu ý tham khảo đoạn code sau dùng trong Procedure Load của Form chính của chương trình:

PUBLIC _PathRoot as String && sử dụng biến chuỗi _PathRoot là biến toàn cục
_PathRoot = left(sys(16,0),rat('\',sys(16,0),1))
_PathRoot=RIGHT(_PathRoot,LEN(_PathRoot)-(rat(':',_PathRoot)-2))
_PathRoot=ADDBS(_PathRoot)
SET DEFAULT TO &_PathRoot && &_PathRoot được khai báo làm thư mục gốc ngầm định

Đoạn code trên khai báo và chọn thư mục chứa Form (chính) này làm thư mục gốc (ngầm định), tham chiếu đến toàn bộ chương trình của bạn.

Chào bạn
Fish eye

tayngangvfp
31-03-2011, 10:22
Hôm nay bác Tayngangvfp đi đâu mà không thấy lên diễn đàn làm em mong mỏi cả mắt !!!
Em định chuyển sang hướng dùng CSDL Access để lưu dữ liệu, vì nó lưu được Unicode. Bác cho em lời khuyên liệu có nên dùng CSDL này không?
Nếu dùng CSDL này thì câu lệnh để Merge ra file Word thế nào ạ?
Rất mong bác tayngangvfp và các cao thủ khác trợ giúp em vụ này với ạ.

@hung_public

Vấn đề ban đầu tưởng là đơn giản, nhưng khi thực hiện lại gặp rất nhiều trở ngại!.

- Nếu dùng Automation để thực hiện lệnh: oWord.ActiveDocument.MailMerge.OpenDataSource thì lại không nhận được dữ liệu unicode? Cho dù chuỗi connect đã dùng Microsoft.Jet.OLEDB.4.0. Cũng chuỗi này nếu ghi 1 macro trong word và chạy thì lại nhận được đúng font unicode?

Hiện tại có 1 giải pháp chữa cháy tạm thời:
http://www.mediafire.com/?8w6w6pnyb14g0hz

Tiếp tục ngâm cứu .....
@hung_public: Gần đây M cũng ít lên 4R, nếu cần trao đổi bạn add nick YM!: tayngangvfp

foxnewbie
31-03-2011, 17:58
Có việc này làm mình nhức đầu quá, nghĩ mãi chưa ra. Các bạn giúp mình với nhé.

Mình có 1 report trong đó tạo group là TK. Khi in ra thì 1 group có thể có nhiều trang. Mình muốn đánh số trang theo group. Ví dụ Group có 3 trang thì đánh Trang 1, Trang 2, Trang 3. Sang Group khác thì lại bắt đầu từ Trang 1 rồi tiếp tục ...

Bí quá rồi. Nhờ mọi người giúp đỡ. Cám ơn rất nhiều

hoangnnm
31-03-2011, 18:36
Có việc này làm mình nhức đầu quá, nghĩ mãi chưa ra. Các bạn giúp mình với nhé.

Mình có 1 report trong đó tạo group là TK. Khi in ra thì 1 group có thể có nhiều trang. Mình muốn đánh số trang theo group. Ví dụ Group có 3 trang thì đánh Trang 1, Trang 2, Trang 3. Sang Group khác thì lại bắt đầu từ Trang 1 rồi tiếp tục ...

Bí quá rồi. Nhờ mọi người giúp đỡ. Cám ơn rất nhiều

Chỉ cần chọn mục "Reset page number to 1 for each group" trong phần Data grouping .

Nhưng có 1 bug của vfp đó là khi chạy report theo group thì _pagetotal không total theo group mà total theo group đầu tiên. Nên ví dụ như group 1 có 2 trang , group 2 có 3 trang thì bạn không thể xác định được _pagetotal là 2 cho group 1 và 3 cho group 2 , vfp chỉ hiểu _pagetotal = 2 . Điều này dẫn đến 1 số điều kiện in ( print when ) liên quan đến _pagetotal sẽ trật : ví dụ chỉ in khi _pagetotal = _pageno :) .

foxnewbie
01-04-2011, 08:23
Chỉ cần chọn mục "Reset page number to 1 for each group" trong phần Data grouping .

Nhưng có 1 bug của vfp đó là khi chạy report theo group thì _pagetotal không total theo group mà total theo group đầu tiên. Nên ví dụ như group 1 có 2 trang , group 2 có 3 trang thì bạn không thể xác định được _pagetotal là 2 cho group 1 và 3 cho group 2 , vfp chỉ hiểu _pagetotal = 2 . Điều này dẫn đến 1 số điều kiện in ( print when ) liên quan đến _pagetotal sẽ trật : ví dụ chỉ in khi _pagetotal = _pageno :) .

Sao mình không thấy mục "Reset page number to 1 for each group" hả bạn. Mình không biết cách đưa hình lên forum. Mình đã chọn Report - Data grouping nhưng chỉ thấy có "Reprint group header on each page" thôi.

Nhân tiện xin hỏi thêm là : Mình có thể định dạng trang giấy để có thể in 2 phiếu trên 1 trang A4 không? Nếu được thì chỉ cho mình luôn nhé.

Cám ơn mọi người

Fish eye
01-04-2011, 09:10
Sao mình không thấy mục "Reset page number to 1 for each group" hả bạn. Mình không biết cách đưa hình lên forum. Mình đã chọn Report - Data grouping nhưng chỉ thấy có "Reprint group header on each page" thôi.

Nhân tiện xin hỏi thêm là : Mình có thể định dạng trang giấy để có thể in 2 phiếu trên 1 trang A4 không? Nếu được thì chỉ cho mình luôn nhé.

Cám ơn mọi người

Gửi bạn foxnewbie

Có thể do mỗi phiên bản VFP6/7/8/9 có trình bày khác một chút, nhưng cơ bản là đủ các chức năng chọn in cần thiết.

Tôi mô tả menu Report dưới đây theo phiên bản VFP9

Mở Report cần chỉnh:

1- Chọn số trang bắt đầu từ số 1 cho đầu mỗi group

- Từ Menu VFP trên cùng chọn Report --> chọn thẻ trang Data Grouping… --> Hộp thoại Report Properties mở.

- Tại thẻ trang Data Grouping, từ danh sách Group nesting oder --> chọn biểu thức nhóm dữ liệu mà bạn muốn (group của bạn là TK)

- Trong Option Group start on --> chọn Option New page number 1

- Đánh dấu vào checkbox Reprint group header on each page (nếu cần)

-Chọn OK


2- In 2 phiếu trên 1 trang A4

Bạn có thể in nhiều phiếu trên một trang A4, tùy vào việc thiết kế số hàng fields trong Report, và độ cao mỗi band trong report của bạn, chứ không cần định dạng trang giấy.

Hy vọng giúp được bạn chút ít.

Chào bạn
Fish eye

luu_luu
01-04-2011, 10:31
Sao mình không thấy mục "Reset page number to 1 for each group" hả bạn. Mình không biết cách đưa hình lên forum. Mình đã chọn Report - Data grouping nhưng chỉ thấy có "Reprint group header on each page" thôi.

Nhân tiện xin hỏi thêm là : Mình có thể định dạng trang giấy để có thể in 2 phiếu trên 1 trang A4 không? Nếu được thì chỉ cho mình luôn nhé.

Cám ơn mọi người

mình có ý kiến về in 2 phiếu trên 1 trang A4, cơ quan mình dùng report để in chứng từ ghi sổ, mỗi chứng từ chỉ cần 1/2 trang A4, bạn nên tạo mẫu giấy mới có size = 1/2 A4
để tạo mẫu mới, start - setting - printers and faxes - right click vào vùng trống - server properties - create a new form - nhập tên tùy bạn thí dụ a4chia2 - khung paper size
Width = độ rộng A4 <8 inches>
Height = cao A4 chia 2 <11 inches /2 = 5.5>
cuối cùng bấm save form -

khi thiết kế report chọn tên mẫu giấy bạn mới tạo - khi in bạn sẽ in được 2 phiếu trên 1 tờ A4.

foxnewbie
01-04-2011, 10:32
Gửi bạn foxnewbie

Có thể do mỗi phiên bản VFP6/7/8/9 có trình bày khác một chút, nhưng cơ bản là đủ các chức năng chọn in cần thiết.

Tôi mô tả menu Report dưới đây theo phiên bản VFP9

Mở Report cần chỉnh:

1- Chọn số trang bắt đầu từ số 1 cho đầu mỗi group

- Từ Menu VFP trên cùng chọn Report --> chọn thẻ trang Data Grouping… --> Hộp thoại Report Properties mở.

- Tại thẻ trang Data Grouping, từ danh sách Group nesting oder --> chọn biểu thức nhóm dữ liệu mà bạn muốn (group của bạn là TK)

- Trong Option Group start on --> chọn Option New page number 1

- Đánh dấu vào checkbox Reprint group header on each page (nếu cần)

-Chọn OK


2- In 2 phiếu trên 1 trang A4

Bạn có thể in nhiều phiếu trên một trang A4, tùy vào việc thiết kế số hàng fields trong Report, và độ cao mỗi band trong report của bạn, chứ không cần định dạng trang giấy.

Hy vọng giúp được bạn chút ít.

Chào bạn
Fish eye

Rất cám ơn hướng dẫn rất rõ ràng và kịp thời của 2 bạn Fish Eye và hoangnnm, mình đã làm được phần 1 theo hướng dẫn. Nhưng ở phần 2 về in 2 phiếu trên 1 trang A4 thì mình vẫn còn vướng ở điểm này : Chi tiết của record có thể in trên 1 hay nhiều dòng tuỳ thuộc vào số ký tự trong field của record đó nên mình không thể cố định số hàng và độ cao mỗi band được.

Làm sao bây giờ các bạn ơi !

khzaof
01-04-2011, 10:32
Gửi bạn Khzaof

- Mở Report cần chỉnh:

...
2- Chỉnh độ rộng Report:
Tại Menu VFP trên cùng chọn Report --> Properties… --> thẻ trang Page layout --> Colunm --> Chỉnh trị số Spinner Width (tăng/giảm độ rộng Report).

.......

Nếu gợi ý này không đúng ý, bạn cho biết nhé.

Chào bạn
Character
thanks :punk:
Sao mình không làm được nhỉ ,cái Mục Width rộng nhất là 8.500 in .Tăng lên không được ,chỉ giảm xuống được thôi :(

duonglx
01-04-2011, 14:09
Hi cac pro!
có ai có tài liệu ve window form trong foxpro ko nhỉ.
Cho mình xin để tham khảo nha.
Thank all!

Character
01-04-2011, 15:41
thanks :punk:
Sao mình không làm được nhỉ ,cái Mục Width rộng nhất là 8.500 in .Tăng lên không được ,chỉ giảm xuống được thôi :(

Gửi bạn Khzaof

Mỗi loại khổ giấy (Letter, A4, A3…) VFP quy định khống chế độ rộng (Width) tối đa khác nhau, chỉ có thể tăng/giảm trong phạm vi Max/Min cho phép, còn nếu bạn vẫn muốn độ rộng của khổ giấy đó lớn hơn giá trị tối đa VFP cho phép, thì theo tôi Bạn chỉ còn cách can thiệp trực tiếp vào Data của Report đó, cách làm như sau:

Mở Data của Report bằng cách chạy các dòng lệnh sau tại cửa sổ lệnh chẳng hạn:

Use <Tên đường dẫn\tên Report>
Brow

Sau khi Data của report này đã mở, tại Record (dòng) đầu tiên, Bạn tìm đến field <Width> nhập giá trị cần chỉnh (ví dụ trước đó là 85000.000 --> tăng lên 90000.000)

Sau đó phát lệnh đóng Data Report này lại (Close tabl all) --> mở Report này để xem giá trị Width của Report đã tăng theo ý muốn.

Chào bạn
Character

tayngangvfp
02-04-2011, 08:16
@hung_public
Gửi bạn phần thực hiện Mailmerge đã hoàn chỉnh.

http://vn.360plus.yahoo.com/tayngangvfp/article?mid=126

khzaof
02-04-2011, 11:19
@Character :cám ơn bạn nhá ,mình chỉnh được rồi nhờ chọn các cỡ giấy A3 :punk:
(cái này còn phụ thuộc vào lúc mình in nên không nên chỉnh)

mọi người giúp mình cái demo csdl này với .yêu cầu trong đó.
http://www.mediafire.com/?4bpx5bkoqqgr6vo
thanks mọi người nhiều .

Thiên_Thần
02-04-2011, 21:47
Các pro ơi! cho e hỏi chút ak


DO case
CASE this.Caption="sua"
thisform.them.Enabled =.F.
thisform.xoa.Enabled =.F.
thisform.thoat.Enabled =.F.

thisform.makh.Value=makh
thisform.tenkh.Value=tenkh
thisform.diachikh.Value=diachikh
thisform.sotk.Value=sotk
thisform.masothue.Value=masothue
thisform.dienthoai.Value=dienthoai

this.Caption="Luu"
n=RECNO()
GO RECORD n
DELETE
PACK
thisform.grid1.RecordSourceType = 1
thisform.grid1.RecordSource = "khach_hang"

thisform.grid1.column1.header1.Caption ="makh"
thisform.grid1.column1.width=84
thisform.grid1.column1.header1.FontName ="ABC Sans Seri"
thisform.grid1.column1.header1.Fontsize =14

thisform.grid1.column2.header2.Caption ="tenKh"
thisform.grid1.column2.width=150
thisform.grid1.column2.header2.FontName ="ABC Sans Seri"
thisform.grid1.column2.header2.Fontsize =14

thisform.grid1.column3.header3.Caption ="diachiKH"
thisform.grid1.column3.width=84
thisform.grid1.column3.header3.FontName ="ABC Sans Seri"
thisform.grid1.column3.header3.Fontsize =14

thisform.grid1.column4.header4.Caption ="sotk"
thisform.grid1.column4.width=84
thisform.grid1.column4.header4.FontName ="ABC Sans Seri"
thisform.grid1.column4.header4.Fontsize =14

thisform.grid1.column5.header5.Caption ="Masothue"
thisform.grid1.column5.width=84
thisform.grid1.column5.header5.FontName ="ABC Sans Seri"
thisform.grid1.column5.header5.Fontsize =14

thisform.grid1.column6.header6.Caption ="dienthoai"
thisform.grid1.column6.width=84
thisform.grid1.column6.header6.FontName ="ABC Sans Seri"
thisform.grid1.column6.header6.Fontsize =14


thisform.Refresh
CASE this.Caption="L­u"
thisform.them.Enabled =.T.
thisform.xoa.Enabled =.T.
thisform.thoat.Enabled =.T.

SET ORDER to makh
IF SEEK(ALLTRIM(thisform.makh.value))
MESSAGEBOX([ §· cã kh¸ch hµng nµy!])
RETURN
ENDIF
INSERT INTO khach_hang(makh,tenkh,diachikh,sotk,masothue,dient hoai) ;
values ( thisform.makh.Value,thisform.tenkh.Value,thisform. diachikh.Value,thisform.sotk.Value,thisform.masoth ue.Value,thisform.dienthoai.Value)
thisform.makh.Value=""
thisform.tenkh.Value=""
thisform.diachikh.Value=""
thisform.sotk.Value=""
thisform.masothue.Value=""
thisform.dienthoai.Value=""
thisform.grid1.Refresh
this.Caption="Söa"
ENDCASE
thisform.makh.SetFocus
thisform.Refresh


Trên là code cho command " Sửa"...không biết em sai chỗ nào mà không sửa được ak.
huhu giúp e với

hanhung87
02-04-2011, 22:42
giờ mình muốn tạo func tương tư hàm VLOOKUP của Excel, thì làm ntn nhi? các bạn giúp mình với. VD

file1: HSSV.DBF (SBD<a1, a2, a3, a4>;TEN<b1, b2, b3, b4>)
File2: TRUNGTUYEN.DBF (SBD<a2,a3>;TEN<?, ?>)

FIEL TEN của TRUNGTUYEN.DBF đang trống không có thông tin, mình muốn lấy thông tin TEN tu file HSSV.DBF thì làm ntn, các bạn giúp mình với a.

Character
02-04-2011, 23:06
Các pro ơi! cho e hỏi chút ak

DO case
.................
CASE this.Caption="sua"
thisform.them.Enabled =.F.
................
this.Caption="Luu"
n=RECNO()
GO RECORD n
DELETE
PACK
................
thisform.grid1.column1.header1.FontName ="ABC Sans Seri"
................
thisform.grid1.column2.header2.FontName ="ABC Sans Seri"
.................
CASE this.Caption="L­u"
.................
ENDCASE
thisform.makh.SetFocus
thisform.Refresh


Trên là code cho command " Sửa"...không biết em sai chỗ nào mà không sửa được ak.
huhu giúp e với


Gửi bạn Thiên_Thần

Code của bạn sai cú pháp khá nhiều. Bạn cho biết Email của bạn đi, để tiện trao đổi.

Chào bạn
Character

tuan_tvkg
03-04-2011, 01:48
file1: HSSV.DBF (SBD<a1, a2, a3, a4>;TEN<b1, b2, b3, b4>)
File2: TRUNGTUYEN.DBF (SBD<a2,a3>;TEN<?, ?>)
SELECT 0
USE HSSV.DBF ALIAS HS
INDEX ON SBD TO isbd
SELECT 0
USE TRUNGTUYEN.DBF ALIAS TT
SET RELATION TO SBD INTO HS
REPL ALL TEN WITH HS.TEN

Thiên_Thần
03-04-2011, 07:51
-> Character
Thanks a! đây là Mail của em: Vuthuy88888@gmail.com
Mong reply sớm từ anh!

bautroixanh15b
03-04-2011, 08:33
Các bạn cho mình hỏi:
Mình có một form Quản lý điểm, trong form có các combo box và 1 grid (để thể hiện csdl khi chọn ở combo box cụ thể là combo box (chứa fields tên các tên khoa,tên ngành,tên chuyên ngành,tên lớp, tên môn học,học kỳ, khóa học). Bây giờ mình muốn khi chọn tên của 1 khoa, có ngành, có tên chuyên ngành, tên lớp, tên môn học...trong combo box thì trên grid chỉ hiển thị danh sách của 1 khoa đó học những ngành và chuyên ngành... chọn ở trên đó mà thôi thì làm thế nào.
Mong các bạn giúp đỡ!
Tớ cảm ơn nhiều.

Character
03-04-2011, 08:45
-> Character
Thanks a! đây là Mail của em: Vuthuy88888@gmail.com
Mong reply sớm từ anh!


Gửi bạn Thiên_Thần

Bạn mở Email của Bạn để xem hướng dẫn

Chào bạn
Character

[=========> Bổ sung bài viết <=========]


Các bạn cho mình hỏi:
Mình có một form Quản lý điểm, trong form có các combo box và 1 grid (để thể hiện csdl khi chọn ở combo box cụ thể là combo box (chứa fields tên các tên khoa,tên ngành,tên chuyên ngành,tên lớp, tên môn học,học kỳ, khóa học). Bây giờ mình muốn khi chọn tên của 1 khoa, có ngành, có tên chuyên ngành, tên lớp, tên môn học...trong combo box thì trên grid chỉ hiển thị danh sách của 1 khoa đó học những ngành và chuyên ngành... chọn ở trên đó mà thôi thì làm thế nào.
Mong các bạn giúp đỡ!
Tớ cảm ơn nhiều.

Gửi bạn bautroixanh15b

Nếu Bạn muốn xem danh sách Quản lý điểm SV theo tên Khoa nào đó, Bạn nhập đoạn Code sau vào Procedure Valid của Combobox

Set filt to Allt(Lower(Khoa))=Allt(Lower(This.Value))
Thisform.Refresh

Chào bạn
Character

Thiên_Thần
03-04-2011, 10:19
Character ơi! a gửi nhầm mail sao ý, em vẫn chưa nhận được mail ak
a gửi lại cho e đi ak !

vuthuy88888@gmail.com

hoặc:

nho_thuthuy_88@yahoo.com

khzaof
03-04-2011, 10:25
giúp mình câu trên với #1396 :(

hung_public
03-04-2011, 11:37
@hung_public
Gửi bạn phần thực hiện Mailmerge đã hoàn chỉnh.

http://vn.360plus.yahoo.com/tayngangvfp/article?mid=126

Cám ơn bác Tayngangvfp!
em đã tải phiên bản Merge mới về rồi nhưng chạy bị lỗi Word không thể mở file data source bác ạ. nó báo ở dòng oWord.ActiveDocument.MailMerge.OpenDataSource(tSou rce, 0,.F.,,.T.,,,,,,,tConnection, tSQLStatement)
cả 2 nút bấm đều báo lỗi như vậy
Em thấy chương trình bác gửi hôm trước về giải pháp Merge từ MDB là tương đối ổn, tuy nhiên nó lại có cái chưa được là phải bấm Yes để mở Data Source khi mở file Word lên, sau đó mới quay về Fox bấm OK mới Merge được.
Nếu giải quyết được vấn đề này là OK thôi.

Character
03-04-2011, 11:45
Character ơi! a gửi nhầm mail sao ý, em vẫn chưa nhận được mail ak
a gửi lại cho e đi ak !

vuthuy88888@gmail.com

hoặc:

nho_thuthuy_88@yahoo.com

Gửi bạn Thiên_Thần

Tôi đã gửi Email (lần 2) theo địa chỉ: vuthuy88888@gmail.com và C/c nho_thuthuy_88@yahoo.com
Nếu không nhận được nữa báo cho Tôi biết nhé.

Chào bạn
Character

[=========> Bổ sung bài viết <=========]


giúp mình câu trên với #1396 :(

Gửi bạn Khzaof

Bạn cho biết Email để Tôi gửi

Chào bạn
Character

khzaof
03-04-2011, 14:55
gửi vào mail mình nhá :
bruce.voz@gmail.com

Character
03-04-2011, 16:20
gửi vào mail mình nhá :
bruce.voz@gmail.com

Gửi bạn Khzaof

Tôi gửi Mail file nén Rar đính kèm. Sau khi giải nén, Bạn chạy file exe để xem kết quả, nếu có chỗ nào không vừa ý cho Tôi biết nhé.

Chào bạn
Character

Thiên_Thần
03-04-2011, 16:51
Thanks Charecter nhìu! 2T đã nhận được mail, và chương trình cũng đã chạy oy! nhưng có 1 số vấn đề 2T muốn hỏi, 2T đã reply mail cho Character oy!
Thân!

hung_public
03-04-2011, 21:03
em đã tải phiên bản Merge mới về rồi nhưng chạy bị lỗi Word không thể mở file data source bác ạ. nó báo ở dòng oWord.ActiveDocument.MailMerge.OpenDataSource(tSou rce, 0,.F.,,.T.,,,,,,,tConnection, tSQLStatement)
cả 2 nút bấm đều báo lỗi như vậy

Ok rồi bác Tayngangvfp ạ, lúc trước em chạy bằng Word 2010 nên bị lỗi, giờ em chạy bằng Word 2003 thì OK luôn.
Em hỏi thêm bác một vấn đề nữa, nếu muốn chọn một bản ghi để Merge ra Word thì có thực hiện được khi Select ở file MDB không? nếu được thì làm thế nào?

tayngangvfp
04-04-2011, 07:50
Ok rồi bác Tayngangvfp ạ, lúc trước em chạy bằng Word 2010 nên bị lỗi, giờ em chạy bằng Word 2003 thì OK luôn.
Em hỏi thêm bác một vấn đề nữa, nếu muốn chọn một bản ghi để Merge ra Word thì có thực hiện được khi Select ở file MDB không? nếu được thì làm thế nào?

Được. Bạn thêm điều kiện lọc cho câu lệnh SQL, vd:
tSQLStatement=[select MaNhanVien,Ho,Ten,GTNam,NGaySinh,LuongCoBan,GhiChu From NhanVien Where LuongCoBan<3000000]

Nhưng tại sao bạn không lọc trực tiếp từ .DBF trước khi ghi vào file .MDB?

hanhung87
04-04-2011, 11:59
thank kiu ban tuan_tvkg đã giúp mình bài trước
-------------
các bạn giúp mình với, mình có file GH.PRG
mình có câu lệnh ntn:

APPEND FROM kugd_all FOR dnth>0 AND ng_dhan<{^2012/01/01}

giờ mình muốn tạo 1 Project có nút "TẠO" và nút "HỦY"
- "TẠO" thì chạy GH.PRG có "ng_dhan<{^2012/01/01}" mình muốn tùy chỉnh "TẠO" với "ng_dhan" nhập từ Project

các bạn giúp mình với

nunna
04-04-2011, 22:04
Các bạn cho mình hỏi câu lệnh của bài này như nào với:

Tính phucap trong trường hợp
+Nếu chucvu là giamdoc và phogiamdoc thì phucap là 500
+Nếu chucvu là truongphong và phophong thì phucap là 300
+Còn lại là 200
Cám ơn các bạn!

khzaof
05-04-2011, 05:10
http://cB0.upanh.com/20.826.27733979.mF80/untitled.jpg
Mình có dùng hàm sum ở nút tien .
Tự nhiên nó hiện thanhtien 3885.00 Bây giờ mình muốn xóa cái đó đi thì làm cách nào đây ??
Giúp mình nhá ,thanks :D

luu_luu
05-04-2011, 07:45
http://cB0.upanh.com/20.826.27733979.mF80/untitled.jpg
Mình có dùng hàm sum ở nút tien .
Tự nhiên nó hiện thanhtien 3885.00 Bây giờ mình muốn xóa cái đó đi thì làm cách nào đây ??
Giúp mình nhá ,thanks :D

vào LOAD event của FORM
SET TALK OFF && tắt chế độ hội thoại

robotfpt
05-04-2011, 08:29
Các bạn cho mình hỏi câu lệnh của bài này như nào với:

Tính phucap trong trường hợp
+Nếu chucvu là giamdoc và phogiamdoc thì phucap là 500
+Nếu chucvu là truongphong và phophong thì phucap là 300
+Còn lại là 200
Cám ơn các bạn!

_phucap = IIF(chucvu = "giamdoc" OR chucvu = "phogiamdoc", 500, IIF(chucvu = "truongphong" OR chucvu = "phophong", 300, 200))

hung_public
05-04-2011, 08:55
Được. Bạn thêm điều kiện lọc cho câu lệnh SQL, vd:
tSQLStatement=[select MaNhanVien,Ho,Ten,GTNam,NGaySinh,LuongCoBan,GhiChu From NhanVien Where LuongCoBan<3000000]

Nhưng tại sao bạn không lọc trực tiếp từ .DBF trước khi ghi vào file .MDB?

Em dùng thêm điều kiện nhưng nó báo lỗi anh ạ. e sửa dòng:
tSQLStatement=[select MaNhanVien,Ho,Ten,GTNam,NGaySinh,LuongCoBan,GhiChu From NhanVien where ALLTRIM(nhanvien.manhanvien)=ALLTRIM(thisform.cbMa NV.Value)]
Có cách nào không anh? Em định không xử lý (đọc ghi) vào DBF mà ghi trực tiếp vào MDB luôn, như vậy có gặp khó khăn gì không anh?

tayngangvfp
06-04-2011, 07:44
Em dùng thêm điều kiện nhưng nó báo lỗi anh ạ. e sửa dòng:
tSQLStatement=[select MaNhanVien,Ho,Ten,GTNam,NGaySinh,LuongCoBan,GhiChu From NhanVien where ALLTRIM(nhanvien.manhanvien)=ALLTRIM(thisform.cbMa NV.Value)]
Có cách nào không anh? Em định không xử lý (đọc ghi) vào DBF mà ghi trực tiếp vào MDB luôn, như vậy có gặp khó khăn gì không anh?

Câu lệnh Select này phải dùng đúng cú pháp và các hàm được hỗ trợ bởi Access. Vì vậy bạn thử:
-Thay hàm ALLTRIM() bằng hàm tương tự của Access xem sao.
-Thay "thisform.cbMaNV.Value" bằng giá trị cụ thể: vì nếu để như vậy, khi truyền vào Access nó sẽ không hiểu thisform.cbMaNV.Value là cái gì.

hung_public
06-04-2011, 09:24
Câu lệnh Select này phải dùng đúng cú pháp và các hàm được hỗ trợ bởi Access. Vì vậy bạn thử:
-Thay hàm ALLTRIM() bằng hàm tương tự của Access xem sao.
-Thay "thisform.cbMaNV.Value" bằng giá trị cụ thể: vì nếu để như vậy, khi truyền vào Access nó sẽ không hiểu thisform.cbMaNV.Value là cái gì.

Em đã thử theo cách anh nói đó là:
Thêm một biến KH_chon=alltrim(thisform.cbMaNV.Value)
cuối dòng select em thêm điều kiện trim(makh)=kh_chon nhưng nó vẫn báo lỗi ở không mở được data source anh ạ.
Hình như nó giống trường hợp anh không select * from được thì phải.
cuối cùng em đành xử lý theo kiểu filte từ file dbf, sau đó chỉ export sang mdb bản ghi đó thôi.

tayngangvfp
06-04-2011, 09:45
Em đã thử theo cách anh nói đó là:
Thêm một biến KH_chon=alltrim(thisform.cbMaNV.Value)
cuối dòng select em thêm điều kiện trim(makh)=kh_chon nhưng nó vẫn báo lỗi ở không mở được data source anh ạ.
Hình như nó giống trường hợp anh không select * from được thì phải.
cuối cùng em đành xử lý theo kiểu filte từ file dbf, sau đó chỉ export sang mdb bản ghi đó thôi.

Vấn đề là câu select SQL đó là chuỗi truyền cho Access, nên bạn dùng thisform.cbMaNV.Value thì cũng giống như KH_Chon thôi !.

Cách làm đúng là phải xây dựng 1 chuỗi như SQL thế nào mà khi thực truyền cho Access no sẽ có dạng Select ...... From ... Where TRIM(nhanvien.manhanvien) = "Một giá trị cụ thể"

Có thể làm tương tự như:

tSQLStatement=[select MaNhanVien,Ho,Ten,GTNam,NGaySinh,LuongCoBan,GhiChu From NhanVien where TRIM(nhanvien.manhanvien)=]
tSQLStatement=tSQLStatement+["] + ALLT(thisform.cbMaNV.Value) +["]

hung_public
06-04-2011, 15:07
Vấn đề là câu select SQL đó là chuỗi truyền cho Access, nên bạn dùng thisform.cbMaNV.Value thì cũng giống như KH_Chon thôi !.

Cách làm đúng là phải xây dựng 1 chuỗi như SQL thế nào mà khi thực truyền cho Access no sẽ có dạng Select ...... From ... Where TRIM(nhanvien.manhanvien) = "Một giá trị cụ thể"

Có thể làm tương tự như:

tSQLStatement=[select MaNhanVien,Ho,Ten,GTNam,NGaySinh,LuongCoBan,GhiChu From NhanVien where TRIM(nhanvien.manhanvien)=]
tSQLStatement=tSQLStatement+["] + ALLT(thisform.cbMaNV.Value) +["]

Em đã sửa lại như câu lệnh trên của anh, em xem trace thấy giá trị đúng cú pháp Select ...... From ... Where TRIM(nhanvien.manhanvien) = "Một giá trị cụ thể" rồi nhưng vẫn lỗi không mở được Data source anh ạ. Không biết tại sao nữa.

tayngangvfp
06-04-2011, 15:35
Em đã sửa lại như câu lệnh trên của anh, em xem trace thấy giá trị đúng cú pháp Select ...... From ... Where TRIM(nhanvien.manhanvien) = "Một giá trị cụ thể" rồi nhưng vẫn lỗi không mở được Data source anh ạ. Không biết tại sao nữa.

Bạn thử kiểm tra lại với cú pháp trong Access xem: có thể không có hàm Trim? hay dấu bao bọc chuỗi là " hay ' ?. Kiểu như:

tSQLStatement=[select MaNhanVien,Ho,Ten,GTNam,NGaySinh,LuongCoBan,GhiChu From NhanVien Where TRIM(manhanvien)=]
tSQLStatement=tSQLStatement+['] + ALLT(tValue) +[']

Nhưng có lẽ thực hiện lọc trong VFP trước khi xuất qua MDB là hay nhất.

user_001
06-04-2011, 16:09
Chào các bạn! Cho mình hỏi, mình có một ứng dụng chạy trên nền VFP7. Khi chạy nó bị bảng command che đi. Có cách nào để tự nó ẩn đi không?

Character
06-04-2011, 17:14
Chào các bạn! Cho mình hỏi, mình có một ứng dụng chạy trên nền VFP7. Khi chạy nó bị bảng command che đi. Có cách nào để tự nó ẩn đi không?

Gửi bạn user_001

Để đóng cửa sổ lệnh Command khi chạy chương trình, Bạn nhập dòng lệnh sau đây trong sự kiện Load của Form chính hoặc trước dòng lệnh gọi khởi động giao diện chính của chương trình:

KEYBOARD "{Ctrl+F4}"

Chào bạn
Character

khzaof
06-04-2011, 23:09
vào LOAD event của FORM
SET TALK OFF && tắt chế độ hội thoại

cám ơn bạn ,mình làm được rồi :D

hung_public
07-04-2011, 09:21
Bạn thử kiểm tra lại với cú pháp trong Access xem: có thể không có hàm Trim? hay dấu bao bọc chuỗi là " hay ' ?. Kiểu như:

tSQLStatement=[select MaNhanVien,Ho,Ten,GTNam,NGaySinh,LuongCoBan,GhiChu From NhanVien Where TRIM(manhanvien)=]
tSQLStatement=tSQLStatement+['] + ALLT(tValue) +[']

Nhưng có lẽ thực hiện lọc trong VFP trước khi xuất qua MDB là hay nhất.

Em làm đươc rồi, cảm ơn anh rất nhiều!
Có một vấn đề nữa em muốn hỏi các bác có kinh nghiệm, đó là khi xuất dữ liệu từ DBF sang MDB thì các trường kiểu Date nếu không nhập giá trị (rỗng) thì khi xuất ra nó lại tự động lấy ngày hiện tại. Vậy để xử lý vấn đề này phải làm thế nào? các bác có cao kiến gì giúp em một tay với.

hoangnnm
07-04-2011, 09:26
Em làm đươc rồi, cảm ơn anh rất nhiều!
Có một vấn đề nữa em muốn hỏi các bác có kinh nghiệm, đó là khi xuất dữ liệu từ DBF sang MDB thì các trường kiểu Date nếu không nhập giá trị (rỗng) thì khi xuất ra nó lại tự động lấy ngày hiện tại. Vậy để xử lý vấn đề này phải làm thế nào? các bác có cao kiến gì giúp em một tay với.

Nếu làm chữa cháy nhanh thì nếu rỗng gán cho nó ngày là 01/01/2099 chẳng hạn , sau khi xuất ra thì update lại file mdb , nếu bằng ngày 01/01/2099 thì gán lại rỗng , he he .

hung_public
07-04-2011, 09:46
Nếu làm chữa cháy nhanh thì nếu rỗng gán cho nó ngày là 01/01/2099 chẳng hạn , sau khi xuất ra thì update lại file mdb , nếu bằng ngày 01/01/2099 thì gán lại rỗng , he he .

Cám ơn bác, nhưng giải pháp này em cho rằng không ổn, nhất là trong trường hợp của em. Có bác nào có ý kiến xử lý hay hơn không ạ?

khzaof
09-04-2011, 00:13
Cho mình hỏi: mình muốn báo cáo có các định dạng số kiểu như này 1,000,000 thay cho 1000000 thì trong report phải làm như thế nào ?Cám ơn :punk:

Character
09-04-2011, 00:44
Cho mình hỏi: mình muốn báo cáo có các định dạng số kiểu như này 1,000,000 thay cho 1000000 thì trong report phải làm như thế nào ?Cám ơn :punk:

Gửi bạn Khzaof

Mở Report cần chỉnh:

DoubleClick vào field cần chỉnh định dạng --> xuất hiện hộp thoại Field Properties --> chọn thẻ trang Format --> tại hộp nhập Format expression, gõ định dang như sau: 999,999,999

Chọn OK

Hộp thoại Field Properties còn nhiều tùy chọn khác, Bạn có thể tự tìm hiểu thêm để sử dụng khi cần.


Chào
Character

tayngangvfp
09-04-2011, 06:30
Cám ơn bác, nhưng giải pháp này em cho rằng không ổn, nhất là trong trường hợp của em. Có bác nào có ý kiến xử lý hay hơn không ạ?

Nếu không cần tính toán trên field ngày đó thì có thể chuyển đổi sang kiểu chuỗi trước khi ghi vào .MDB

hung_public
09-04-2011, 10:04
Nếu không cần tính toán trên field ngày đó thì có thể chuyển đổi sang kiểu chuỗi trước khi ghi vào .MDB

Cám ơn bác, cách xử lý này rất hay! đáp ứng được yêu cầu của em rồi.

xuan_vnpt
10-04-2011, 15:45
Ai biết chỉ dùm
Trong chương trình fox ấn nút để chạy 1 chương trình .exe khác ở bên ngoài?

khzaof
10-04-2011, 19:21
Thanks Character . :D

robotfpt
10-04-2011, 19:28
Ai biết chỉ dùm
Trong chương trình fox ấn nút để chạy 1 chương trình .exe khác ở bên ngoài?
Run c:\game.exe, hoặc:
! c:\game.exe

Forensic
13-04-2011, 23:07
Chào các bạn câu lạc bộ Visual Fox. Tôi là thành viên mới vào, còn lúng túng quá. Tôi có bài tập cần giải rất mong sự giúp đơc của các bạn. Đề như sau:
Viết một thủ tục Tìm tất cả các bản ghi trong dữ liệu, nếu thấy hai bản ghi giống nhau về sohoso (ten truong)-> xóa đi một bản.
Mong nhận được sự giúp đỡ của các bạn. Địa chỉ liên hệ Huy.Forensic@Gmail.com

eddy7iet
14-04-2011, 12:29
E co 1 chuong trinh quan ly Diem
Yeu cau thiet ke 1 form vơi 2 Combobox
combo 1 la lua chon cac khoa hoc, khi chon 1 trong cac khoa hoc thi thong tin ve cac lop hoc se dc loc theo combo 1.
combo 2 la danh sach cac lop hoc da dc chon theo combo 1
Vay cho em hoi cau lenh de lien ket va dap ung yeu cau do la gi ?
Mong Admin cho e loi giai !

Character
14-04-2011, 13:02
Chào các bạn câu lạc bộ Visual Fox. Tôi là thành viên mới vào, còn lúng túng quá. Tôi có bài tập cần giải rất mong sự giúp đơc của các bạn. Đề như sau:
Viết một thủ tục Tìm tất cả các bản ghi trong dữ liệu, nếu thấy hai bản ghi giống nhau về sohoso (ten truong)-> xóa đi một bản.
Mong nhận được sự giúp đỡ của các bạn. Địa chỉ liên hệ Huy.Forensic@Gmail.com

Gửi Forensic...

Bạn dùng thử đoạn Code này xem
Trường hợp Bạn có bảng Table1 cần xử lý đặt tại thư mục hiện hành

*--------------------
Set talk off
Clos table all
Use Table1 exclu
Go top
nRecc=Recc()
lThoat=.F.
Do while lThoat=.F. && Dung vong lap Do While de Xoa tat ca (nhieu hon 02) Sohoso trung lap trong bang Table1
For i=1 to Recc()
Go i
nSohoso1=Sohoso
nBghi1=Recn()
Skip
Loca for nSohoso1=Sohoso
If foun() and i<>Recn()
Dele
Cont
Endi
Endf
nRecc=Recc()
Pack
nRecc1=Recc()
If nRecc1=nRecc
lThoat=.T.
Endi
Endd
Retu
*--------------------
Chào bạn
Character

eddy7iet
14-04-2011, 13:23
E co 1 chuong trinh quan ly Diem
Yeu cau thiet ke 1 form vơi 2 Combobox
combo 1 la lua chon cac khoa hoc, khi chon 1 trong cac khoa hoc thi thong tin ve cac lop hoc se dc loc theo combo 1.
combo 2 la danh sach cac lop hoc da dc chon theo combo 1
Vay cho em hoi cau lenh de lien ket va dap ung yeu cau do la gi ?
Mong Admin cho e loi giai !
Help me!!!

[=========> Bổ sung bài viết <=========]

Em có 1 chương tình quản lý Điểm
Yêu cầu là tạo 1 Form với 2 combobox
Combo 1 là thể hiện danh sách các khóa học (k1,k2,k3)
Combo 2 là thể hiện danh sách các lớp học, các lớp học này đã được lọc từ combo1 (Ví dụ trong k1 có l1,l2,l3)
Vậy làm thế nào để liên kết và tham chiếu 2 combo hiểu nhau và đáp ứng yêu cầu đề bài,kính mong chỉ giúp!

Character
14-04-2011, 15:18
Em có 1 chương trình quản lý Điểm
Yêu cầu là tạo 1 Form với 2 combobox
Combo 1 là thể hiện danh sách các khóa học (k1,k2,k3)
Combo 2 là thể hiện danh sách các lớp học, các lớp học này đã được lọc từ combo1 (Ví dụ trong k1 có l1,l2,l3)
Vậy làm thế nào để liên kết và tham chiếu 2 combo hiểu nhau và đáp ứng yêu cầu đề bài,kính mong chỉ giúp!


Gửi Eddy7iet

Câu hỏi của bạn không có gì phức tạp, nhưng Bạn phải nói rõ hơn về cách dùng bảng và cấu trúc bảng table của mình … Nếu 02 Combobox1 và Combobox2 sử dụng 02 bảng table khác nhau thì các câu lệnh (Code) sẽ khác với 02 Combobox dùng một bảng table. Câu trả lời thì không khó nhưng không đủ dữ kiện mà chỉ đoán rất khó trả lời, viết không đúng ý Bạn. Bạn cho biết Email để người khác tiện liên hệ khi cần

Chào Bạn.

Forensic
14-04-2011, 19:05
Cám ơn Character nhiều, tôi đã đọc lời giải của bạn, copy và sẽ chạy thử. Rất tiếc là tại gia đình máy tính tôi không cài Fox. Kết quả, tôi sẽ báo lại sau, cám ơn bạn

eddy7iet
14-04-2011, 19:57
Anh ơi !
Đúng rùi !
combo 1 là áp dụng cho tblkhoa (khóa học)
conbo 2 là áp dụng cho tbllop (lớp học)
vì tham chiếu như vậy mới có dữ liệu dc chứ ạ !
Gmail của em : haclongma9x@gmail.com
Kính mong các anh giúp đỡ nhiều, e đang cần gấp !
Tất nhiên là 2 bảng khác nhau rùi, thiết kế trên cùng 1 form, mỗi combo là 1 bảng, và anh character ơi, cho em cái mail or nick yahoo em hỏi a cho dễ, chứ đợi thế này, e đến chít mất !

Character
14-04-2011, 21:03
Gửi Eddy7iet ...

Xem Mail, rồi liên hệ với tôi.

Character

minhthkt
14-04-2011, 22:30
Chào các anh chị!
e là thành viên mới ra nhập diễn đàn.
e đang làm bt lq đến VFP
đề tài của e là xây dựng HTQL Lương.
có j e mong mọi ng jup đỡ.
Thanks nhiu a!

ngthva
15-04-2011, 13:35
Chào các bạn! Các bạn giúp cho tôi nhé! Tôi tạo 1 form "Lịch dạy trong tuần", trong form có 18 combobox (từ combo1 -> combo18) mỗi combo dùng chung 1 CSDL "Môn học" để chọn. Thí dụ: Combo1 chọn TOÁN, combo2 chọn HÓA ..... cho đến hết 18 combo và được chứa vào CSDL khác mang tên "Lịch học". Tôi đã thực hiện chọn các môn học cho 18 combo nhưng khi kích save và mở tập tin "Lịch học" ra thì chỉ có 1 mẫu tin được đưa vào ngoài không còn gì hết.
Các bạn giúp cho tôi: Làm sao khi chọn môn học trên 18 combobox sẽ được chứa vào đầy đủ trên tập tin lịch học... Giúm các bạn nhé!

luu_luu
15-04-2011, 14:05
Chào các bạn! Các bạn giúp cho tôi nhé! Tôi tạo 1 form "Lịch dạy trong tuần", trong form có 18 combobox (từ combo1 -> combo18) mỗi combo dùng chung 1 CSDL "Môn học" để chọn. Thí dụ: Combo1 chọn TOÁN, combo2 chọn HÓA ..... cho đến hết 18 combo và được chứa vào CSDL khác mang tên "Lịch học". Tôi đã thực hiện chọn các môn học cho 18 combo nhưng khi kích save và mở tập tin "Lịch học" ra thì chỉ có 1 mẫu tin được đưa vào ngoài không còn gì hết.
Các bạn giúp cho tôi: Làm sao khi chọn môn học trên 18 combobox sẽ được chứa vào đầy đủ trên tập tin lịch học... Giúm các bạn nhé!

theo mình hiểu ý của bạn là khi save thì 18 môn được cập nhật thành 18 record vào tập tin lịch học phải không? nói thêm đi.
nếu như ý trên thì bạn xem thử:
for i=1 to 18
cmb=[combo]+alltrim(str(i))
insert into lichhoc (monhoc) value (thisform.&cmb..Value)
endfor

ngthva
15-04-2011, 14:13
Chào bạn Luu_Luu!
Đúng ý mình là muốn cùng một lúc lưu vào 18 mẫu tin sau khi chọn

[=========> Bổ sung bài viết <=========]

Chào bạn Luu_Luu, Mình đã thử đoạn code trên vẫn không nhập được vào tập tin lịh học.

luu_luu
15-04-2011, 14:54
Chào bạn Luu_Luu!
Đúng ý mình là muốn cùng một lúc lưu vào 18 mẫu tin sau khi chọn

[=========> Bổ sung bài viết <=========]

Chào bạn Luu_Luu, Mình đã thử đoạn code trên vẫn không nhập được vào tập tin lịh học.

bạn thử lại code này xem
for i=1 to 18
cmb=[combo]+alltrim(str(i))
giatri=thisform.&cmb..Value
insert into lichhoc (monhoc) value (giatri)
endfor
chú ý câu lệnh : thisform.&cmb..Value < sau &cmb phải có hai ..Value>
mình đã thử cả hai cách đều được trên fox7 và fox9
nếu chưa được bạn gởi cho mình xem: taolao_q@yahoo.com.vn

Forensic
15-04-2011, 21:33
Cám ơn Character!
Tôi mới vào diễn đàn có thể chỉ tính bằng ngày. Qua sự giúp của bạn tôi thấy phải cố gắng. Nguyên nhân là phần nhập liệu tôi không thể cho chạy trên mạng LAN được. Tôi bó tay phải cài trên 03 máy. Hàng tuần, tháng làm báo cáo Copy từ 03 dữ liệu -> Appen tập hơp ->có thể nhầm lẫm làm báo cáo thiếu chính xác. Sau giúp đỡ của bạn giờ an tâm rồi. Về vấn đề này có thể phải nhờ các bạn trên diễn đàn và Character nhiều. Cám ơn Character và các bạn

phuonglc2011
18-04-2011, 09:14
Nhờ các cao thủ chỉ giúp:
Mình có 2 bảng: 1. dsto (madv, mato, tento)
2. dsnv(manv, mato)
mình muốn hiển thị trên cùng 1 report trên là danh sách tổ trong cùng 1 đơn vị (1 đơn vị có nhiều tổ) , ở dưới là danh sách nhân viên trong cùng 1 đơn vị

(report dùng 2 bảng có số lượng record cùng thay đổi theo từng đơn vị).

Forensic
18-04-2011, 23:15
Tôi cần sự giúp đỡ ngoài Visual Fox một chút. Bạn nào biết xin chỉ giúp với: Máy tính của đơn vị tôi bị nhiễm virut U3ROM. Chúng tôi không có phần mềm diệt virut bản quyền. Hiện tại tôi dùng Symantec không trị được. Tôi đã dùng Boot CD chạy XP mini nhưng không biết nó nằm ở đâu để Delet. Mong các ban chỉ giúp!
Cán ơn các bạn!

nunna
21-04-2011, 18:24
các bác cho e hỏi câu lệnh của nút cmd Sửa trong Form nhập dữ liệu là gì với? cám ơn các bác nhiều

Forensic
22-04-2011, 18:28
Các bạn chỉ giúp nhé: Tôi muốn người nhập buộc phải phập mục ngaynhan câu lệnh thế nào?
Tôi đã dùng Valit day(ngaynhan)=0 err'Phải vào dữ liệu'. Khi nhập chương trình vẫn cho qua mặc dù không nhập số liệu mục nagynhan

Character
22-04-2011, 19:44
Các bạn chỉ giúp nhé: Tôi muốn người nhập buộc phải nhập mục ngaynhan câu lệnh thế nào?
Tôi đã dùng Valid day(ngaynhan)=0 err 'Phải vào dữ liệu'. Khi nhập chương trình vẫn cho qua mặc dù không nhập số liệu mục ngaynhan


Gửi bạn Forensic
Để buộc người dùng phải nhập ngày nhận, Bạn lưu ý 02 dòng lệnh sau tại 02 vị trí trong chương trình:

*------------------
.................
.................
@5,9 say 'Ngày nhận ' get ngaynhan Valid !Empt(ngaynhan) erro 'Phải nhập ngày nhận'
.................
.................
READ Valid !Empt(ngaynhan)
.................
*------------------

Lệnh READ có kèm Valid !Empt(ngaynhan) nhằm không cho thoát khỏi lệnh READ nếu người dùng chưa nhập ngày nhận (tránh trường hợp có thể người dùng Click chuột bỏ qua dòng lệnh @ …Say …. get ngaynhan Valid !Empt(ngaynhan) .... trước đó).
Nếu chưa đúng ý, Bạn cho biết nhé.

Chào Bạn.
Character

Forensic
22-04-2011, 20:53
Tôi sẽ thử, chắc là bạn chỉ đúng tôi thiếu và lại cho rằng day(ngaynhan)=0 nên không được.

tayngangvfp
23-04-2011, 10:14
Các bạn chỉ giúp nhé: Tôi muốn người nhập buộc phải phập mục ngaynhan câu lệnh thế nào?
Tôi đã dùng Valit day(ngaynhan)=0 err'Phải vào dữ liệu'. Khi nhập chương trình vẫn cho qua mặc dù không nhập số liệu mục nagynhan

Nếu bạn dùng textbox control trên form thì để thực hiện yêu cầu trên chỉ việc viết code trong sự kiện Valid của textbox như sau:

***
IF empty(this.value)
MESAGEBOX([Phai nhap giai tri....])
RETU 0
ENDIF
***

KOR9999
23-04-2011, 13:01
Mình vừa mới học FoxPro cho mình hỏi mình cần tạo 1 table có Mã khách,Họ tên, Địa chỉ, Loại bánh và Giá tiền.
Loại bánh thì có loại bé (50k/chiếc), trung bình (85k/chiếc), lớn (120k/chiếc). Bạn nào chỉ mình cái phần tạo Loại bánh mà nó chỉ được có 1 trong 3 dữ liệu trên với. Mình cảm ơn.

thaonguyen.22289
24-04-2011, 14:57
xl anh character anh có thể gửi mail cho em được k ah,em đang có khúc mắc về foxpro!tks a.
mail của em :thaonguyen.22289@gmail.com

Character
24-04-2011, 18:02
xl anh character anh có thể gửi mail cho em được k ah,em đang có khúc mắc về foxpro!tks a.
mail của em :thaonguyen.22289@gmail.com

Gửi Thaonguyen.22289

Bạn có thể nêu câu hỏi của Bạn trên DĐTH này để được nhiều người giúp, hoặc khi cần thiết có thể liên hệ Mail với Tôi (Tôi đã gửi địa chỉ Mail cho Bạn).

Chào Bạn.
Character

luu_luu
25-04-2011, 09:19
Mình vừa mới học FoxPro cho mình hỏi mình cần tạo 1 table có Mã khách,Họ tên, Địa chỉ, Loại bánh và Giá tiền.
Loại bánh thì có loại bé (50k/chiếc), trung bình (85k/chiếc), lớn (120k/chiếc). Bạn nào chỉ mình cái phần tạo Loại bánh mà nó chỉ được có 1 trong 3 dữ liệu trên với. Mình cảm ơn.

loại bánh thì chỉ có 1 field trong table thôi, nhưng khi nhập liệu thì bạn mới chọn 1 trong 3 dữ liệu

minhthkt
25-04-2011, 22:01
:)
chào cả nhà ạ!
em là ng mới vào diễn đàn a
e dang làm 1 chương trình quản lý lương bẳng vfp
e tự học, vì có it time nên e thấy khó quá ạ.
mọi người jup đỡ em nha!
ts khi tạo form xong e xem lại cửa sổ thiết kế của các bảng thì lại không được ạ? nó toàn báo lỗi file với command đấy.
với lại em không thoát dc chương trình.không bít có pải e kai lỗi ko ạ?

[=========> Bổ sung bài viết <=========]

cả nhà jup e với nha!
mail của em là minhthkt@gmail.com
yahoo: vaemdayeu_bn90

Forensic
27-04-2011, 22:20
Bạn nào biết giúp tôi nhé!
Tôi cần sắp xếp các bản ghi -> in danh sách lớp học theo đúng ABC ... Z tiếng Việt.

hongquangtn
29-04-2011, 09:32
Xin hỏi các bạn 1 chút. tôi có thiết kế 1 GRID có các cột tên sách, mã sách nay muốn thêm 1 cột ảnh trang bìa thì phải làm thế nào
Thank

khanhlinh284
02-05-2011, 10:58
Send mail cho minh di,minh se mail cho ban
Anh có thể gửi cho em nữa ko ạ. Em cũng đang cần đoạn code này. Mail của em là khanhlinh284@gmail.com. Em cảm ơn!

dungk3cv1
02-05-2011, 17:32
bác nào giỏi về VFP thì làm hộ em bài qunr lý cho thuê nhà vs.
em mông lung quá.

hangyenbai89
03-05-2011, 08:47
cho mình hỏi khi mình tạo report muốn cho trang in nằm ngang (lanscape) thì phải làm như thế nào ?Mình vào page setup rồi nhưng mục lanscape nó bị ẩn .

Forensic
03-05-2011, 21:12
Nếu bạn dùng textbox control trên form thì để thực hiện yêu cầu trên chỉ việc viết code trong sự kiện Valid của textbox như sau:

***
IF empty(this.value)
MESAGEBOX([Phai nhap giai tri....])
RETU 0
ENDIF
***
Cám ơn bạn nhiều. Tôi thực sự chưa biết tới textbox control, lên không áp dụng cách của bạn được, đúng như bạn nói. Sau khi đọc lại và đặc biệt Character giúp đỡ tôi đã thực hiện được yêu cầu với câu lênh:
Read ngaynhan Valid ! empty(ngaynhan) err "Phải nhập ngày nhận". Tôi mong muốn sẽ tiếp tục nhận được sự giúp đỡ của bạn và các bạn khác trên diễn đàn.
Forensic

dungnt.pro
05-05-2011, 07:42
bác nào giỏi về VFP thì làm hộ em bài qunr lý cho thuê nhà vs.
em mông lung quá.
Bạn cố gắng học chút cơ bản đi. Rồi các anh em hướng dẫn cho.
Chứ làm sao mà làm hộ bạn được. Trừ khi anh nào đó có sẵn!

[=========> Bổ sung bài viết <=========]


cho mình hỏi khi mình tạo report muốn cho trang in nằm ngang (lanscape) thì phải làm như thế nào ?Mình vào page setup rồi nhưng mục lanscape nó bị ẩn .

Mình chưa gặp trường hợp này bao giờ. Bạn thử tạo report mới xem có bị vậy không? Nếu không bị, bạn copy toàn bộ các nội dung từ report hiện tại sang.
Nếu có thể bạn hãy chụp lại màn hình rồi post lên anh em có chuyên môn sẽ hỗ trợ.

Vinhnguyen_inter
05-05-2011, 11:13
Trước tiên em xin chào tất cả các bác trong diễn đàn. Hiện em đang có một khó khăn trong việc thể hiện Grid
Hiện em muốn cho người dùng nhập/xóa/sửa dữ liệu trực tiếp trên Grid của Form (Cái này được vì Grid cho phép và cũng đơn giản) nhưng cái khó nhất mà em tìm hiểu cũng như tìm kiếm trên mạng nhưng không có đó là làm thể nào để Grid thể hiện được nhiều Header như dạng sau:

http://www.flickr.com/photos/62492464@N02/5689423110/

Vậy em rấ mong được các bác giúp đỡ em thể hiện Grid được như vậy hoặc sử dụng OCX nào cũng được. Em cám ơn các bác rất nhiều. Have a nice day !

infortech
05-05-2011, 14:47
Bạn cố gắng học chút cơ bản đi. Rồi các anh em hướng dẫn cho.
Chứ làm sao mà làm hộ bạn được. Trừ khi anh nào đó có sẵn!

[=========> Bổ sung bài viết <=========]



Mình chưa gặp trường hợp này bao giờ. Bạn thử tạo report mới xem có bị vậy không? Nếu không bị, bạn copy toàn bộ các nội dung từ report hiện tại sang.
Nếu có thể bạn hãy chụp lại màn hình rồi post lên anh em có chuyên môn sẽ hỗ trợ.

Kiểm tra lại xem trên máy của bạn có cài máy in nào chưa, nếu chưa add tạm một cái HP laser 4L vào , sẽ ok

hello2115
05-05-2011, 15:57
Co ai giup phan command button hien tieng viet cho font chu .vntimes trong visuafoxpro . gium di

minhthkt
05-05-2011, 16:12
:(
có anh chị nào làm về quản lý lương không? giúp em với.
gấp lắm rồi.

[=========> Bổ sung bài viết <=========]

giúp em nhé: vaemdayeu_bn90

hangyenbai89
05-05-2011, 23:41
Mình chưa gặp trường hợp này bao giờ. Bạn thử tạo report mới xem có bị vậy không? Nếu không bị, bạn copy toàn bộ các nội dung từ report hiện tại sang.
Nếu có thể bạn hãy chụp lại màn hình rồi post lên anh em có chuyên môn sẽ hỗ trợ.
Thanks
mình tạo report mới này ,bạn nhìn xem
http://cB1.upanh.com/22.165.29159810.W30/fox.jpg

Ps:Ah cho mình hỏi ,mình có cái button xóa bản ghi trong grid
cụ thể như sau

x= MESSAGEBOX("B¹n cã muèn xãa b¶n ghi nµy kh«ng?",1+32,"Th«ng b¸o")
IF x=1
SELECT dmnhanvien
IF EOF()
RETURN
ELSE
n=RECNO()
GO RECORD n
DELETE
PACK

thisform.grid1.Refresh
ENDIF
ENDIF
khi dùng lệnh pack thì khi xóa xong nó lại làm trắng cái grid .Ai có cách nào khắc phục không ?? có nên bỏ cái pack không nhỉ ??

luu_luu
06-05-2011, 08:02
Thanks
mình tạo report mới này ,bạn nhìn xem
http://cB1.upanh.com/22.165.29159810.W30/fox.jpg

Ps:Ah cho mình hỏi ,mình có cái button xóa bản ghi trong grid
cụ thể như sau

khi dùng lệnh pack thì khi xóa xong nó lại làm trắng cái grid .Ai có cách nào khắc phục không ?? có nên bỏ cái pack không nhỉ ??

mình có 2 cách:
không phát lệnh PACK sau DELETE, mà đưa vào destroy event hay Load event


SET DELETE OFF
LOCATE FOR DELETE()
IF FOUND()
PACK
ENDIF

hocpham
06-05-2011, 18:30
Bác nào biết cách khắc phục lỗi này ko giúp em với? bị lỗi đó làm em ko cài được Foxpro
http://upnhanh.sieuthinhanh.com/tmpimages/images/sieuthiNHANH2011050612518y2jkn2njyz27850.jpeg

http://upnhanh.sieuthinhanh.com/tmpimages/images/sieuthiNHANH2011050612518ywy1ywm3yt39410.jpeg
Thanks

hangyenbai89
06-05-2011, 22:37
mình có 2 cách:
không phát lệnh PACK sau DELETE, mà đưa vào destroy event hay Load event


SET DELETE OFF
LOCATE FOR DELETE()
IF FOUND()
PACK
ENDIF

Hi cám ơn ,để mình thử xem nào
Hix mình làm rồi nhưng vẫn chưa xóa hẳn nhỉ ,cho đoạn code kia vào destroy trong form hay là grid đấy bạn ??heo mi


*hi mình tìm ra 1 cách vẫn dùng pack ở sau delete ,và ở đằng sau có lệnh gọi lại chính cái form đấy .:D Hơi thủ công :punk:


@hocpham :có thể bộ cài bị lỗi
bạn down bản này xem thế nào ,mình chia thành 3 file ,down xong rồi ghép nó lại
http://www.mediafire.com/?fbt9ue239uyu2

tayngangvfp
07-05-2011, 13:18
Lệnh PACK trong Fox được thực hiện như thế nào:
1- Có lẽ chỉ có fox mới có cái lệnh delete hơi khó hiểu: chỉ đánh dấu xóa chứ không xóa hẳn!
2-Vì vậy Fox lại có lệnh SET DELETE [ON/OFF] để điều khiển việc thao tác (tính toán,....) trên các record đã đánh dấu xóa đó.
3- SET DELETE OFF: đây thường là mặc định, khi đó các lệnh sẽ tính toán trên cả những record đã được đánh dấu xóa, Lệnh BROW hay dùng Control GRID cũng sẽ hiện lên những record này.
4- SET DELETE ON: các lệnh sẽ KHÔNG tính toán những record đã được đánh dấu xóa, BROW hay GRID KHÔNG thể hiện những record này. Nên nếu dùng lệnh SET DELETE ON thì các record được đánh dấu xóa coi như không tồn tại! => Chả cần thực hiện lệnh PACK làm gì mà số liệu tính toán vẫn đúng!
5- Khi thực hiện lệnh PACK, fox sẽ làm như sau (với điều kiện là table phải mở ở chế độ EXCLUSIVE): 1)copy toàn bộ những record CHƯA đánh dấu xóa sang 1 table khác; 2) Xóa table hiện tại; 3)Đổi tên table mới tạo ra (gồm chỉ những record chưa xóa) thành tên table cũ. Do phải mở ở chế độ EXCLUSIVE nên khi sử dụng trong môi trường nhiều người dùng (nhiều máy sử dụng cùng lúc) thì sẽ phát sinh vấn đề lớn!
6- Khi dùng GRID để thể hiện table => nó sẽ liên kết chặt với table đó. Khi lệnh PACK được thực hiện =>table bị xóa (xóa file trên đĩa)=> GRID bị mất RecordSource => thể hiện trắng xóa!
7- Để giải quyết vấn đề GRID bị trắng xóa sau PACK: trước khi PACK, lưu lại toàn bộ các giá trị của Grid như: Tên RecordSourece, Số cột, ControlSource của các cột, tên Caption các cột (header), độ rộng, ..... Các giá trị này sẽ được gán trở lại cho Grid sau khi PACK!
8- Như vậy thay vì PACK ngay sau khi DELETE có thể dùng lệnh SET DELETE ON ngay từ đầu chương trình thì sẽ tối ưu hơn rất nhiều!
9- Nếu vẫn thích PACK (hình như các bạn mới lập trình với FOX đặc biệt ưa thích DELETE xong là phải PACK liền!) thì có thể làm theo cách 7 (với lưu ý phải kiểm tra cẩn thận trong môi trường nhiều người dùng), hoặc 1 cách tối ưu hơn là dùng SET DELETE ON và sau đó định kỳ 1,5,10 ngày hay 1 tháng sẽ duyệt qua toàn bộ các table trong database để PACK dọn dẹp dữ liệu 1 lần. Đoạn code dọn dẹp này có thể đặt tại vị trí trước khi thoát hẳn chương trình.
10- Đối với các table có đặt khóa chính (PK) hay Candidate sẽ có 1 vấn đề nhỏ phát sinh: FOX sẽ báo lỗi nếu 1 record nhập mới mà có khóa trùng với 1 record đã được đánh dấu xóa! (Lỗi này có lẽ là 1 trong những lý do làm cho các bạn mới dùng FOX thích PACK ngay sau DELETE!) Cách giải quyết rất đơn giản: khi tạo khóa (trong tab Indexes) đánh lệnh sau trong mục "Filter" : NOT DELETE() hoặc !DELETE()

Hy vọng vài điều trên sẽ giúp các bạn mới đỡ phải vất vả với lệnh DELETE và PACK của FOXPRO/VFP.

Forensic
08-05-2011, 21:20
Nhờ các bạn cùng Character, tayngangVFP chỉ giúp:
Tôi thấy các bạn nói nhiều tới việc chuyển tệp DBF sang tệp Excel và ngược lại. Câu lệnh thế nào trong một thủ tục? các bạn chi giúp nhé!

luu_luu
09-05-2011, 07:36
Hi cám ơn ,để mình thử xem nào
Hix mình làm rồi nhưng vẫn chưa xóa hẳn nhỉ ,cho đoạn code kia vào destroy trong form hay là grid đấy bạn ??heo mi


*hi mình tìm ra 1 cách vẫn dùng pack ở sau delete ,và ở đằng sau có lệnh gọi lại chính cái form đấy .:D Hơi thủ công :punk:


@hocpham :có thể bộ cài bị lỗi
bạn down bản này xem thế nào ,mình chia thành 3 file ,down xong rồi ghép nó lại
http://www.mediafire.com/?fbt9ue239uyu2

nếu bạn vẫn muốn PACK sau DELETE thì đoạn CODE nằm ở détroy hoặc load của form nha...với điều kiện như bạn tayngang nói là phải mở table trong chế độ exclusive on.

Forensic
09-05-2011, 21:51
Chào bạn Hangyenbai89, tôi cũng cần và muốn cài lại Visualfox, đã Download 03 File theo đường dẫn của bạn cho trên diễn đàn nhưng không biết ghép lại để cài. Bạn chỉ giúp tôi nhé. Cám ơn bạn nhiều! Forensic.

hangyenbai89
09-05-2011, 22:36
Thanks các bạn ở trên nhế

@...:bạn dùng cái này nhé
http://www.mediafire.com/?f5jah5his7hsci6

split là chia ,join là ghép
Giao diện rất dễ sử dụng .

Forensic
09-05-2011, 22:59
Tôi down về nhưng không bung ra được. Cám ơn bạn đã trợ giúp!
Forensic

Thanks các bạn ở trên nhế

@...:bạn dùng cái này nhé
http://www.mediafire.com/?f5jah5his7hsci6

split là chia ,join là ghép
Giao diện rất dễ sử dụng .

[=========> Bổ sung bài viết <=========]


Nhờ các bạn cùng Character, tayngangVFP chỉ giúp:
Tôi thấy các bạn nói nhiều tới việc chuyển tệp DBF sang tệp Excel và ngược lại. Câu lệnh thế nào trong một thủ tục? các bạn chi giúp nhé!

Tôi đã đọc Mail của bạn giúp đỡ tôi. Chắc cũng như những lần trước, bài toán đã được bạn giải giúp! cám ơn bạn - Forensic.

newalone
13-05-2011, 19:01
Bác tayngangvfp hay bác nào biết foxweb do hãng nào phát triển? Thông tin càng nhiều càng tốt. Thanks!

code demo ở trang http://www.foxweb.com


<html>
<head>
<title>Name Search</title>
</head>
<body>
<h3>Search Criteria:</h3>

<p>This example illustrates how simple it is to write FoxWeb
applications. The code searches a FoxPro table for matches on the
name entered by the user. Partial matches also yield results. For
Example "mo" will find both "Monroe" and "Morrison." The search is
not case sensitive. To see all the names in the database just leave
the Name entry blank.</p>

<form action="NameSearch.fwx" method="post">
Name:
<input name="name" maxlength="30" value="<%=Request.Form("name")%>">
<input type="submit" value="Search">
</form>
<hr>
<%
IF Request.FormCount("name") <> 0
SET EXACT OFF && So that partial names will work
SELECT * FROM Names;
WHERE UPPER(name) = UPPER(Request.Form("name"));
ORDER BY name INTO CURSOR results

* Check if there were any hits
IF _TALLY > 0
%><h3>Search Results:</h3><%
SCAN
Response.Write(results.name + "<br>")
ENDSCAN
ELSE
%><h3>Your Search Yielded No Results</h3><%
ENDIF
ENDIF
%>
</body>
</html>

hangyenbai89
13-05-2011, 22:40
Tôi down về nhưng không bung ra được. Cám ơn bạn đã trợ giúp!
.

sao mình gửi link cho đứa bạn ,nó vẫn dùng được mà .:D

TrangHoa73
15-05-2011, 10:34
Em mới học Foxpro mong các bạn chỉ giúp.
em thấy có một vài phần mềm sau khi Refox thì trên các form hay class không còn code nữa. Nhưng phần mềm vẫn hoạt động tốt.
Em muốn thực hiện xóa code như thế em phải làm như thế nào? Bác nào giúp em nhé.
Em mò hơn 3 ngày mà chưa được.Nó chỉ xóa được trên chương trình Foxpro đang thiết kế, nhưng sau khi biên dịch ra EXE và Refox lại thì code vẫn còn y nguyên.
mail cua em: tranghoa111273@yahoo.com.vn

phuonglc2011
16-05-2011, 08:44
Mong các bạn chỉ giúp! Mình có report1 khoảng 1000 trang in trên máy in đảo giấy, nhiều khay. Mình muốn in trang 1 ở khay 1, trang 2 ở khay 2, trang 3 khay 3, trang 4 quay về khay 1... Mình thấy ở Visual Basic thì làm đc

Private Sub cmdPrt_Click()
Open txtPath.Text For Input As #1 'Mo File
Printer.ScaleMode = 6
'CHON CHE DO 1 MAT hay 2 MAT
VbPRDPSimplex =1 &&In 1 mat
VbPRDPHorizontal =2 && 2 mat tu trai qua phai
vbPRDPVertical=3 && tu tren xuong duoi
Printer.PaperBin = 260
Printer.Duplex = 2 'IN Duplex
PrintStart
TimerPrint.Enabled = True
End Sub
mong các bạn chỉ giúp chuyển sang VFP

Vinhnguyen_inter
17-05-2011, 08:06
Vấn đề 1:


Thanks
mình tạo report mới này ,bạn nhìn xem
http://cB1.upanh.com/22.165.29159810.W30/fox.jpg

Vấn đề 2:
Ps:Ah cho mình hỏi ,mình có cái button xóa bản ghi trong grid
cụ thể như sau

khi dùng lệnh pack thì khi xóa xong nó lại làm trắng cái grid .Ai có cách nào khắc phục không ?? có nên bỏ cái pack không nhỉ ??

Về vấn đề 2 bác tayngangVFp đã nói rất kỹ và chuẩn nên mình không có gì để giải thích thếm

Về vấn đề thứ nhất: Bạn chỉ cần cài một cái máy in ảo vào máy tính của bạn là bạ có thể Xoay ngang được trang giấy.

Chúc bạn thành công

ngluong099
17-05-2011, 16:07
Hiện giờ mình đang làm 1 chương trình quản lý nhân sự vè công việc của các nhân viên.
Nhờ các bạn tư vấn dùm mình có bao nhiêu table và tên của từng table
nhanh nhanh giúp mình với mình đang rất cần.

phuonglc2011
18-05-2011, 09:53
Bạn thử tham khảo dữ liệu này xem có phù hợp với yêu cầu của bạn không.
http://upnhanh.sieuthinhanh.com/tmpimages/images/sieuthiNHANH2011051813720mgeyztaxzt1162374.jpeg

ngluong099
19-05-2011, 07:57
Cám ơn bạn rất nhiều!
bạn có thể gửi lick cho mình xem được rõ hơn phóng to hết cỡ chữ nhỏ quá mình không thấy.

[=========> Bổ sung bài viết <=========]

Bạn có table rồi chắc có bài post bài lên luôn cho mình được không?

vanhaopl
19-05-2011, 14:45
các bạn làm ơn giúp dùm mình. Sự việc là mình cần cùng một lúc xem được 2 report. Mình đã thử nhiều cách nhưng không được.
VD: xem bản báo cáo lãi vay của ngân hàng 1 report thể hiện tháng 1, 1 report thể hiện tháng 2. Nhưng cùng một lúc phải mở được 2 report đó để coi so sánh.

tayngangvfp
19-05-2011, 16:12
các bạn làm ơn giúp dùm mình. Sự việc là mình cần cùng một lúc xem được 2 report. Mình đã thử nhiều cách nhưng không được.
VD: xem bản báo cáo lãi vay của ngân hàng 1 report thể hiện tháng 1, 1 report thể hiện tháng 2. Nhưng cùng một lúc phải mở được 2 report đó để coi so sánh.

Nếu bạn dùng VFP9 thì có thể làm theo ý tưởng sau:
1/ Chạy report và lưu thành file ảnh
2/ Tạo 1 form để xem các file ảnh này => bao nhiêu report cũng được !
.

Parker Pen
19-05-2011, 20:24
các bạn làm ơn giúp dùm mình. Sự việc là mình cần cùng một lúc xem được 2 report. Mình đã thử nhiều cách nhưng không được.
VD: xem bản báo cáo lãi vay của ngân hàng 1 report thể hiện tháng 1, 1 report thể hiện tháng 2. Nhưng cùng một lúc phải mở được 2 report đó để coi so sánh.


Gửi bạn vanhaopl
Đề xuất với Bạn một ý tưởng để tham khảo:

Nếu chỉ với mục đích là xem số liệu thông tin, thay vì Bạn muốn thể hiện 2 Report cùng một lúc thì bây giờ Bạn thiết kế cho thể hiện 2 Grid cùng một lúc trên một biểu mẫu (Form). CursorSource của mỗi Grid lấy từ nguồn Dữ liệu của bảng Table, View hoặc Cursor nào đó (trường hợp cuả Bạn là từng tháng) để thể hiện trên từng Grid. Bạn thiết kế thêm trên Form nút lệnh in, để xuất từng Grid ra Repot khi cần.
Cách này Tôi cũng đã từng sử dụng, đơn giản, dễ thực hiện, tương tự mục đích của Bạn là cần xem 02 Report cùng một lúc như Bạn đã nêu.

Chào Bạn
Parker Pen

changkhoag
21-05-2011, 21:11
Mình có file dữ liệu chứa danh học sinh dự thi (Dulieu.dbf), hiện tại mình đã sắp xếp được số báo danh tăng dần. Nhưng đến khi sắp xếp phòng thi theo điều kiện: mỗi phòng có 24 thí sinh, khi thay đổi mã nghề (ma_nghe) trong cùng mã hội đồng (ma_hd) tăng phòng lên 1, khi chuyển qua mã hội đồng khác thì quay về phòng 1, thực hiện lần lượt như thế trên toàn bộ file dữ liệu. Mong các anh chỉ giáo dùm. Cảm ơn các anh trước. File đính kèm: http://www.mediafire.com/?b8ofoi1tbmumjpz

ngoisaochieu04
23-05-2011, 08:43
Xin chào mọi người.
mình muốn hỏi các pro chút.
Mình có một chương trình Quản lý. Do người sử dụng vì lí do nào đó làm cho 1 table bây giờ không mở được, cũng không Modify được.Máy báo lỗi như sau: "Table đường dẫn tới table... has become corrupted. The table will nedd to repaired before using again"
Bác nào có cách nào bây giờ mở lại được không, sao cho dữ liệu vẫn còn
Xin cảm ơn.
Mong các bác giúp đỡ!

tayngangvfp
23-05-2011, 14:50
Xin chào mọi người.
mình muốn hỏi các pro chút.
Mình có một chương trình Quản lý. Do người sử dụng vì lí do nào đó làm cho 1 table bây giờ không mở được, cũng không Modify được.Máy báo lỗi như sau: "Table đường dẫn tới table... has become corrupted. The table will nedd to repaired before using again"
Bác nào có cách nào bây giờ mở lại được không, sao cho dữ liệu vẫn còn
Xin cảm ơn.
Mong các bác giúp đỡ!

Dùng PM này sửa xem có được không:
http://www.cmstory.com/index.php?name=Pages&func=display&pageid=5&lang=en

ngluong099
23-05-2011, 19:39
Ai đê xuất các table của chương trình quản lý công việc của nhân viên cho mình với !!!!
Xin giúp đỡ

[=========> Bổ sung bài viết <=========]

Ai rảnh không giúp mình cái Table của chương trình quản lý công việc của nhân viên cái !!!!!!!!

phuonglc2011
26-05-2011, 15:59
@changkhoag
Bạn copy vào new.prg rồi chạy thử. Hy vọng đúng yêu cầu của bạn.

************************
CLOSE ALL
set talk off
set stat off
set centu on
set escap off
set safety off

USE dulieu ALIAS dulieu
INDEX on ma_hd + ma_nghe + sbdc TO t1
REPLACE ALL phongso WITH 0
SELECT ma_hd FROM dulieu GROUP BY ma_hd ORDER BY ma_hd INTO CURSOR hoidong
SELECT ma_hd, ma_nghe FROM dulieu GROUP BY ma_hd, ma_nghe ORDER BY ma_hd, ma_nghe INTO CURSOR sophong

SELECT hoidong
GO top
SCAN

SELECT sophong
x=0
SCAN FOR ALLTRIM(sophong.ma_hd)==ALLTRIM(hoidong.ma_hd)
SELECT * FROM dulieu WHERE ALLTRIM(ma_hd)=ALLTRIM(hoidong.ma_hd) AND ALLTRIM(ma_nghe)=ALLTRIM(sophong.ma_nghe) INTO CURSOR dltam
SELECT ma_hd, ma_nghe, sbdc, CEILING(RECNO()/24) + x as phong FROM dltam WHERE ALLTRIM(ma_hd)=ALLTRIM(hoidong.ma_hd) AND ALLTRIM(ma_nghe)=ALLTRIM(sophong.ma_nghe) INTO CURSOR Nghe
UPDATE dulieu SET phongso=nghe.phong from dulieu, Nghe WHERE dulieu.sbdc = nghe.sbdc AND ALLTRIM(dulieu.ma_hd)=ALLTRIM(nghe.ma_hd) AND ALLTRIM(dulieu.ma_nghe)=ALLTRIM(nghe.ma_nghe)
SELECT dulieu
COUNT TO tamx FOR ALLTRIM(ma_hd)=ALLTRIM(hoidong.ma_hd) AND ALLTRIM(ma_nghe)=ALLTRIM(sophong.ma_nghe)
x= CEILING(tamx/24)
ENDSCAN
SELECT hoidong
ENDSCAN
SELECT * FROM dulieu ORDER BY ma_hd, ma_nghe

**********************************************

hongquangtn
30-05-2011, 10:18
Xin hoỉ các bạn nếu tôi muốn các cell trong 1 cột (ví dụ column1)có chữ màu đỏ nếu nội dung của cell đó là chữ "Tổng" thì phải làm thế nào, (Tayngang fox có 1 vi dụ khá chuẩn nhưng đọc mà không hiểu lệnh chốt như thế nào- nay chỉ cần yêu cầu đơn giản như trên) xin chỉ giúp
cám ơn nhièu

tayngangvfp
30-05-2011, 17:05
Xin hoỉ các bạn nếu tôi muốn các cell trong 1 cột (ví dụ column1)có chữ màu đỏ nếu nội dung của cell đó là chữ "Tổng" thì phải làm thế nào, (Tayngang fox có 1 vi dụ khá chuẩn nhưng đọc mà không hiểu lệnh chốt như thế nào- nay chỉ cần yêu cầu đơn giản như trên) xin chỉ giúp
cám ơn nhièu

thisform.grid1.Column1.DynamicBackColor=[IIF("Tổng"$ Tên Field ở cột 1,RGB(255,0,0),thisform.grid1.Column1.BackColor)]

hongquangtn
31-05-2011, 09:29
thank nhieu
quan trong nhat la thisform.grid1.Column1.BackColor ma minh khong tim thay

ngluong099
31-05-2011, 09:32
Mình đang làm đề tài thực tập.
Ai cho mình xin phần mềm quản lý công việc của nhân viên viết bằng Visual Foxpro không.
Chân thành cảm ơn!