Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Tạo Msgbox hoàn toàn bằng Tiếng Việt.
#1
Lâu nay tmtien261 lập "Msgbox hiển thị bằng Tiếng Việt" theo hướng dẫn của các Pro trên diễn đàn rất OK. Các bài Viết rất hay. Tuy nhiên còn các nút OK, Cancel, No ... thì ko thay thế bằng các Button tiếng Việt (Như: Có, không, Thực hiện, không thực hiện ...) được.
Để hiển thị hoàn toàn bằng TV, tmtien261 đã sử dụng Form để làm Msgbox và dùng Tempvars.Add để truyền các lệnh thực hiện.
Nay xin chia sẽ cho các ACE mới vào Acc có tư tưởng "Hướng nội" như tmtien261.
Demo
Thân chào !
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn
#2
Tiến ơi, cách của Tiến cũng rất hay nhưng trên thực tế thì gây một số phiền toái khi phải sử dụng và thừa kế lại tại các ứng dụng khác. Thường thì với cái gì hay sử dụng nhiều, người ta thường chuẩn hóa nó để dùng lại!
Ngày trước mình cũng đã từng làm thế, nhưng sau khi phát hiện ra việc có thể kiểm soát được form MSGBox thì mình thôi không nghiên cứu cái đó và viết lại thành 1 module chuẩn để khi cần chỉ gọi như một hàm MSGBOX thông thường. Thể loại này bên GPE có khá nhiều.
Việc chuyển thành tiếng Việt thì cũng đã bàn rồi đấy. Mình gửi lại liên kết để tham khảo nhé
http://thuthuataccess.com/forum/thread-5...l#pid17818

Còn việc hiển thị thông điệp unicode thì với Access, hoặc ngay cả với Excel, mình thường dùng giải pháp lưu thông điệp Unicode trên Sheet sau đó gọi bằng một hàm khác dạng
MSG("MSG_FORM_CAPTIONOK").
Như thế nó tiện cho cả việc chuyển ngôn ngữ và chuẩn mực trong viết các thông điệp cho chương trình.
Hàm MSG() Sẽ lấy thông điệp trong CSDL hoặc sheet thay vì gõ trực tiếp thông điệp trong code!
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
Reply
Những người đã cảm ơn Minh Tiên
#3
Cảm ơn "paulsteigel". Cách của bạn Pro quá. Mình sẽ nghiên cứu làm theo. Việc gõ một bảng các thông điệp vào Table và sau đó gọi tìm đưa ra Msgbox mình cũng đã làm. Xong phải tra đi, tra lại nhiều lần, mỏi quá nên mình mới cho nó vào thẳng luôn, mỗi lần làm đến đâu, thích gì thì ghi nấy đỡ mệt hà hà !

À còn vấn đề sau mình làm được nhưng phải lòng vòng mất rất nhiều thời gian vẫn Ko ổn định. Bạn cùng các Pro có cách nào giúp mình với nhé ?
Tình huống: Khi truyền dữ liệu từ Excel vào table nếu đặt sai "Tên trường" trong Excel thì bị báo lỗi: 2391 như hình dưới.
MsgBox

Mình muốn tách chữ Field 'Diengiai23' để ghép vào hàm chuyển MsgBox thành tiếng Việt và hiển thị: "Trường 'Diengiai123' trong File Excel không có hoặc jj đó ...".
Bạn có cách nào để móc vào Field lỗi ko ? Mình thấy khi trường tiêu đề nào bị lỗi thì Msgbox của Acc sẽ chỉ ngay đến trường đó, nên mình nghĩ chắc phải có cách móc vào Case lỗi của Acc được, nhưng mình "Gà mờ" nên ko biết cách làm. Bạn cùng ACE có giải pháp nào, giúp mình với nhé !
Thanks !
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn
#4
Sorry nhé hình như khi trước Khải Nguyên có post bài dạng này lên rồi hay sao ấy mà
Bây giờ xin gửi lên cho mọi người tham khảo .Tạm thời mình chỉ làm vậy vậy thôi , cón ai muốn
phát triển cho vẹn toàn thì tùy nhé
http://www.mediafire.com/download/i88ykv...Viet_-.rar
pass mở Form đăng nhập =125678 ,chương trình có hạn chế số lần đăng nhập <20 lần .
Nhập 135 nhấn reset để tiếp tục ,nếu không thì chương trình sẽ đóng khi quá số lần cho phép
Có gì chưa đươc theo ý mình thì xin Sorry
chúc cả nhà vui vẻ , thành đạt , trở thành những nhân tài của Đất Nước Việt Nam
Khải Nguyên !
Chữ ký của khải nguyên Khải Nguyên Xin Gửi lời chào tới Tất cả các bạn trên Diễn Đàn Thủ Thuật Access
Chúc cả nhà may mắn và  thành đạt ! Lightbulb
Reply
Những người đã cảm ơn Minh Tiên
#5
(06-10-13, 09:11 PM)tmtien261 Đã viết: Cảm ơn "paulsteigel". Cách của bạn Pro quá. Mình sẽ nghiên cứu làm theo. Việc gõ một bảng các thông điệp vào Table và sau đó gọi tìm đưa ra Msgbox mình cũng đã làm. Xong phải tra đi, tra lại nhiều lần, mỏi quá nên mình mới cho nó vào thẳng luôn, mỗi lần làm đến đâu, thích gì thì ghi nấy đỡ mệt hà hà !
...

[1. Về việc đưa thông điệp vào code ....]
Thường dẫn viết phần mềm họ tránh điều này, trừ khi không thể hoặc ứng dụng có ít tương tác. Cách Hard-code (đưa các thông tin động vào code) bất tiện ở chỗ mỗi khi cần sửa thông điệp gì đó lại phải vào code, chưa kể đến việc làm đa ngữ càng khó hơn nữa.
Cách tôi nói trong bài trước đơn giản là áp dụng cách quản lý thông điệp của Visual Studio đối với các Resource (gọi là nguồn lực). Ứng dụng của nó tiện ở chỗ.
Ví dụ: Khi ông người dùng, muốn xóa một tài liệu, ta cảnh báo ông ấy là
"Bạn có muốn xóa không? Muốn thì ấn Chấp nhận, không muốn thì đi ra...".
Ta đưa thông điệp đó vào một bảng tblCaption chẳng hạn trong đó có một cột là ID, một cột là nội dung thông điệp Caption_MSG_V chẳng hạn, sau đó nếu muốn thêm một cột thông điệp bằng tiếng Tây ta thêm Caption_MSG_E ...vv (cách này cũng củ chuối nhưng đó là một kiểu tiếp cận).
Còn ID của thông điệp ta đặt là MSG_DELETE_WARN (MSG_XOA_CANHBAO) miễn sao dễ hiểu và có quy tắc để sau này dễ tham chiếu lại.
Sau đó viết một hàm GETMSG(MSGID as String), thế là chỉ cần gọi
MSGBOangryGETMSG("MSG_DELETE_WARN") ) là ta có kết quả ra thông điệp. Nếu muốn sửa thông điệp, chỉ cần vào bảng mà sửa là xong. Việc làm với ngôn ngữ cũng rứa.

[2. Về việc kiểm tra trường dữ liệu....]
Nghe chừng bạn vẫn cứ thích kiểm tra ngay trong Excel chứ không muốn làm ở Access.
Tôi thì vẫn đề nghị bạn dùng bảng phụ như trong 1 topic đã giả nhời. Có chăng ta viết các thủ tục kiểm tra bảng phụ này mà cảnh báo có phải hơn không?.
Cách viết cảnh báo động thế này này - ông Microsoft cũng làm thế thôi
Thông điệp cảnh báo xóa có ID là MSG_DELETE_WARN
Nội dung thông điệp là "Bạn có muốn xóa tập tin %s% không? Nếu muốn, nhấn Chấp nhận, nếu không, nhấn Bỏ qua."
Bạn viết một hàm MSG như thế này này
Mã PHP:
Function GETMSG(MSG_ID As StringOptional Langguage As String "Vi") As String
    Dim iLng 
As Recordset
    
If iMesage "" Then iMesage "SYS_MESSAGE"
    
Set iLng CurrentDb.OpenRecordset("Select [Caption" Langguage "] from Caption where MSG_ID ='" MSG_ID "';")
    If 
iLng.EOF Then
        GETMSG 
"Message has not been defined!"
    
Else
        
GETMSG iLng.Fields(0)
    
End If
    
iLng.Close
End 
Function 

Sau đó bạn làm thế này
If Msgbox(Replace(GETMSG("MSG_DELETE_WARN"),"%s%",TenFile),vbQuestion+vbYesNo)=vbno then Exit Sub
Bạn sẽ có thông điệp như ý!
Còn việc móc vào trường lỗi để sửa, có lẽ mình chưa hiểu ý của bạn hoặc bạn đang muốn đưa quá nhiều thứ vào ứng dụng. Nguyên tắc của dân phần mềm là - lấy cái khó về mình cái dễ về người dùng. Nếu bạn viết cái này cho người dùng thì hãy kiểm soát cái gì mà máy kiểm soát được, đừng bắt người dùng phải biết quá nhiều. Cái họ cần biết là nghiệp vụ của họ và nhấn chuột, gõ thông tin thôi. Đừng bắt họ xuất, nhập Excel.
Nếu có thì chỉ yêu cầu họ chỉ ra file excel sau đó chương trình tự kiểm soát file, đánh giá xem có nhập được không, có lỗi không, nếu lỗi thì ở đâu. Rồi đưa ra thông báo cho người dùng và bảo họ sửa.
Để làm điều đó tốt, bạn cần viết được một thủ tục xử lý lỗi tốt. Vì bạn lấy dữ liệu cho Access vì thế tôi khuyến nghị là bạn nên xử lý dữ liệu trong access vì có nhiều cái - trong excel trông rõ ngon nhưng vào Access nó lại rõ khó nuốt. Điều này là bình thường vì ông Excel kiểm soát kiểu dữ liệu cực kỳ kém do nó được thiết kế để đáp ứng tính mở mà.
Theo thiển ý của tôi, bạn có thể ứng dụng cách mà tôi đã trả lời trong topic kia của bạn với hàm val chẳng hạn.
Còn nếu bạn muốn kiểm soát cả tên trường nữa thì - e là đến lúc vất vả rồi. Hoặc bạn chọn một quy ước là cứ cột số ấy thì có số liệu ấy và thỏa hiệp với người dùng hoặc bạn phải khóa file Excel lại và dùng cách đọc file Excel để lấy số liệu thay vì dùng lệnh transfer.
Có gì tôi không tỏ, bạn cứ nói nhé.
Xin có đôi lời!
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
Reply
Những người đã cảm ơn Minh Tiên
#6
1. Cảm ơn paulsteigel rất nhiều. Bạn đã tốn nhiều "Tâm tư" để HD giúp mình.

2. [2. Về việc kiểm tra trường dữ liệu....]
Không phải là mình muốn kiểm tra trong file Excel mà là không bắt được lỗi khi truyền File vào ntn ? Bạn có thể HD rõ hơn cách bắt lỗi khi đã truyền vào Acc ? Mình đã nghĩ giải pháp bắt lỗi vụ này là:
a- Khai báo kiểu dữ liệu ở tableAcc là text.
b- Truyền dữ liệu từ Excel vào tableAcc.
c- Kiểm tra trường dữ liệu ở tableAcc (Dùng hàm val như ý A "Xuân Thanh" để đổi từ text sang số)
d- Update dữ liệu vào table chính.
Xong mình đang đang phân vân ko biết thực hiện bước c ntn ?

3. [Nếu bạn viết cái này cho người dùng thì hãy kiểm soát cái gì mà máy kiểm soát được, đừng bắt người dùng phải biết quá nhiều. Cái họ cần biết là nghiệp vụ của họ và nhấn chuột, gõ thông tin thôi. Đừng bắt họ xuất, nhập Excel.
Đúng là mình đang viết "Tiện ích" dùng cho mình. Xong người dùng ko phải là mình mà là "Sếp nhà mình".
Mình đã tiếp cận Acc hơn 10 năm rồi, nhưng chỉ viết các "Tiện ích" đơn giản cho công việc. Từ ngày tham gia DĐ mình mới bắt đầu viết PM QL bán hàng bằng quét mã vạch cho Siêu thị Mini của mình và PM đã chạy được 3 tháng ---> cũng tạm ổn.
Ở phần nhập hàng hóa mua vào mình viết thành 2 hình thức. 1: Nhập trực tiếp; 2: Nhập qua File Excel. Xong khi nhập qua Excel mình thấy có trường hợp xảy ra lỗi như Topic đã nêu nên mới nảy sinh ý đồ: Nếu có lỗi phải báo ngay là lỗi gì, ở chỗ nào để "Sếp nhà mình" biết mà sửa đúng chỗ. "Sếp nhà mình" thì lại ko biết TA nên mình mới muốn đưa TA ---> TV và cụ thể chỗ lỗi.

4. [Nguyên tắc của dân phần mềm là - lấy cái khó về mình cái dễ về người dùng]
Tiên ko phải là dân làm PM (Chỉ yêu thích lập trình), nhưng bạn nói nguyên tắc này T rất tâm đắc, đúng là T muốn dễ cho "Sếp nhà mình" nên mới thế.

Một lần nữa T xin cảm ơn paulsteigel cùng các ACE trên D Đ đã giúp đỡ. Chúc ACE luôn khỏe, hạnh phúc và thành đạt.
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn
#7
+ Nếu bắt buộc phải dùng Excel - bạn có thể thiết kế một template trong Excel, quản lý chặt chẽ số liệu nhập vào bằng việc ứng dụng Validation - 1 bước
+ Bước 2 sử dụng query để đưa số liệu vào. Ví dụ đoạn dưới này...
Mã PHP:
Sub testInsert()
    
Dim SqlTxt As String
    SqlTxt 
"INSERT INTO tblSoKTMay ( DienGiaiChiTiet, SoHieuTK, MaSo, SoLuongPS, DonGiaPS, SoPSNo, SoPSCo ) " _
            
"SELECT a.DienGiaiChiTiet, a.SoHieuTK, a.MaSo, a.SoLuongPS, a.DonGiaPS, a.SoPSNo, a.SoPSCo " _
            
"FROM tblTMP as a;"
    
CurrentDb.Execute SqlTxt
End Sub 
Tuy nhiên, nếu bạn thêm dữ liệu thì không sợ bị lỗi, Access chỉ thêm thằng nào khi dữ liệu nó không có vấn đề, còn thằng nào không thỏa mãn, nó sẽ bỏ qua.
Nếu dùng Update thì bạn mới cần kiểm soát số liệu.
Còn nếu bạn vẫn muốn kiểm tra cái nào sai, cái nào đúng thì có lẽ bạn phải ứng dụng phương án dạng thế này:
1. Chạy vụ insert
2. Kiểm tra thằng insert được bao nhiêu bản ghi
3. Đếm xem thằng gốc có bao nhiêu - nếu lệch tức là insert không hết - vậy thì bắt đầu kiểm tra xem những thằng nào không khớp (unmatch) sau đó liệt kê cái nó mà báo thôi!
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
Reply
Những người đã cảm ơn Noname , Minh Tiên
#8
Cảm ơn paulsteigel rất nhiều !
1. Sao mình lại ko nghĩ ra việc đặt "Validation" trong Excel nhỉ ??? Rất dễ thực hiện mà !
Mình sẽ dùng cách này kết hợp với "phương án 2" của bạn để hạn chế tối đa lỗi khi nhập hàng mua vào cho "Sếp nhà mình ".
2. Ở trong bài paulsteigel có giới thiệu cách móc vào hệ thống để chuyển các Button trong Msgbox Acc thành tiếng Việt, mình đã làm theo, xong hệ thống cứ báo lỗi, lúc hạy được, lúc ko chạy được. Hơn nữa Function ko giải phóng kết nối với hệ thống được nên về sau thực hiện các thao tác khác Msgbox cũng là TV lẫn lộn TA rất khó nhìn ...
paulsteigel có demo nào cho mình xin để "nghiên cứu" với nhé !
Một lần nữa xin cảm ơn pausteigel cùng các ACE nhiều nhiều !
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn
#9
Mã PHP:
Option Explicit
'=======================================================
Module for Vietnamized MsgBox function
' This overide default VBA MsgBox function with some small
modifications of textbutton caption....
' Use this MsgBox function like it is in default VBA IDE
'
=======================================================
' Import
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
 
Private Declare Function SetDlgItemText Lib "user32" _
    Alias "SetDlgItemTextW" _
    (ByVal hDlg As Long, _
     ByVal nIDDlgItem As Long, _
     ByVal lpString As String) As Long
 
Private Declare Function SetWindowsHookEx Lib "user32" _
    Alias "SetWindowsHookExA" _
    (ByVal idHook As Long, _
     ByVal lpfn As Long, _
     ByVal hmod As Long, _
     ByVal dwThreadId As Long) As Long
 
Private Declare Function UnhookWindowsHookEx Lib "user32" _
    (ByVal hHook As Long) As Long
 
Handle to the Hook procedure
Private hHook As Long
 
' Hook type
Private Const WH_CBT = 5
Private Const HCBT_ACTIVATE = 5
 
Constants
Public Const IDOK 1
Public Const IDCANCEL 2
Public Const IDABORT 3
Public Const IDRETRY 4
Public Const IDIGNORE 5
Public Const IDYES 6
Public Const IDNO 7

'=======================================================
'
The following enums were taken from MSO type.
'=======================================================
Public Enum MsoAlertIconType
    msoAlertIconCritical = 1
    msoAlertIconInfo = 4
    msoAlertIconNoIcon = 0
    msoAlertIconQuery = 2
    msoAlertIconWarning = 3
End Enum
    
Public Enum MsoAlertButtonType
    msoAlertButtonAbortRetryIgnore = 2
    msoAlertButtonOK = 0
    msoAlertButtonOKCancel = 1
    msoAlertButtonRetryCancel = 5
    msoAlertButtonYesAllNoCancel = 6
    msoAlertButtonYesNo = 4
    msoAlertButtonYesNoCancel = 3
End Enum

Public Enum MsoAlertDefaultType
    msoAlertDefaultFifth = 4
    msoAlertDefaultFirst = 0
    msoAlertDefaultFourth = 3
    msoAlertDefaultSecond = 1
    msoAlertDefaultThird = 2
End Enum

Public Enum MsoAlertCancelType
    msoAlertCancelDefault = -1
    msoAlertCancelFifth = 4
    msoAlertCancelFirst = 0
    msoAlertCancelFourth = 3
    msoAlertCancelSecond = 1
    msoAlertCancelThird = 2
End Enum
'
===================================
' Modify this code for English
Private StrYes As String
Private StrNo As String
Private StrOK As String
Private StrCancel As String

Application title
Private Const App_Title "MsgBox Demo function..."

Function MsgBox(MessageTxt As StringOptional msgStyle As VbMsgBoxStyle) As VbMsgBoxResult
    Beep
    Dim iVal 
As VbMsgBoxStylemsgBoxIcon As MsoAlertIconTypemsgButton As MsoAlertButtonType
    iVal 
msgStyle
    Select 
Case msgStyle
    
Case 20191716' Critical case
        iVal = iVal - 16
        msgBoxIcon = msoAlertIconCritical
    Case 36, 35, 33, 32: ' 
Question case
        
iVal iVal 32
        msgBoxIcon 
msoAlertIconQuery
    
Case 52514948' Exclamation case
        iVal = iVal - 48
        msgBoxIcon = msoAlertIconWarning
    Case 68, 67, 65, 64: ' 
Information case
        
iVal iVal 64
        msgBoxIcon 
msoAlertIconInfo
    End Select
  
    Select 
Case iVal
    
Case 4:
        
msgButton msoAlertButtonYesNo
    
Case 3:
        
msgButton msoAlertButtonYesNoCancel
    
Case 1:
        
msgButton msoAlertButtonOKCancel
    
Case 0:
        
msgButton msoAlertButtonOK
    End Select
    
' Set Hook
    hHook = SetWindowsHookEx(WH_CBT, AddressOf MsgBoxHookProc, 0, GetCurrentThreadId)
    ' 
Display the messagebox
    MsgBox 
Application.Assistant.DoAlert(App_TitleMessageTxtmsgButtonmsgBoxIconmsoAlertDefaultFirstmsoAlertCancelDefaultTrue)
End Function
 
Private Function 
MsgBoxHookProc(ByVal lMsg As LongByVal wParam As LongByVal lParam As Long) As Long
    
If lMsg HCBT_ACTIVATE Then
        StrYes 
"&C" ChrW(243)
        
StrNo "&Kh" ChrW(244) & "ng"
        'StrOK = ChrW(272) & ChrW(7891) & "&ng " & ChrW(253)
        StrOK = "Ch" & ChrW(7845) & "p nh" & ChrW(7853) & "&n"
        StrCancel = "&H" & ChrW(7911) & "y"

        SetDlgItemText wParam, IDYES, StrConv(StrYes, vbUnicode)
        SetDlgItemText wParam, IDNO, StrConv(StrNo, vbUnicode)
        SetDlgItemText wParam, IDCANCEL, StrConv(StrCancel, vbUnicode)
        SetDlgItemText wParam, IDOK, StrConv(StrOK, vbUnicode)
        ' 
Release the Hook
        UnhookWindowsHookEx hHook
    End 
If
    
MsgBoxHookProc False
End 
Function 
Của bạn đây, bạn sử dụng như với hàm MSGBOX thông thường. Đưa đoạn code trên vào một module rồi gọi msgbox như bình thường nhé!
Tôi lười sửa chú thích về tiếng Việt. Vừa mới bổ sung mấy cái Enum/ Constant vì trong access project của bạn không tham chiếu đến bộ thư viện kiểu của Microsoft Office nên tôi đưa vào luôn cho đỡ!
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
Reply
Những người đã cảm ơn Minh Tiên
#10
Cảm ơn paulsteigel nhiều !
Bạn cho mình hỏi thêm tí nhé !
Mình thấy trong trong Msgbox Acc có các biểu tượng: Dấu hỏi, biểu tượng stop, biểu tượng hình Tam giác có chấm thang ...)
Mình đã gọi Msgbox hiển thị cả "Biều tượng" bằng lệnh:

if Msgbox ("Tên chuỗi thông báo", vbQuestion+vbYesNo)= bbYes then

Xong để "Default con trỏ tại Button No" thì mình ko làm sao Default được. Bạn chỉ giúp mình cách gọi nhé !
Thanks !
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  Phần mềm siêu âm viết bằng Access danhxetnghiem 23 3,225 13-10-16, 01:14 PM
Bài mới nhất: danhxetnghiem
  Sử dụng query và các hàm trong report để hoàn thành báo cao nhanh nhất trungminh 5 317 25-09-16, 09:45 PM
Bài mới nhất: trungminh
  [Help] Hiển thị giá trị biến tòan cục ra TextBox ddluyendla 2 161 12-07-16, 04:59 PM
Bài mới nhất: maidinhdan
  Cách tạo số thứ tự bằng kí tự a b c... xuannguyen13 1 430 20-04-15, 11:19 AM
Bài mới nhất: morosumo
  Thiết kế bảng lương co nhiều bảng lương tren cùng 1 trang A4. nguyenvantien87 1 503 19-09-14, 12:00 AM
Bài mới nhất: tiennd67

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ