Mình mới đăng kí làm thành viên của diễn dàn. Từ khi được trao đổi, học tập qua diễn đàn, mình thấy Excel càng hữu ích. Nhưng do hiểu biết về excel còn kém, chưa đóng góp được gì, chỉ hỏi, nên mong mọi người giúp đỡ nhiều.
Khi soạn thảo code trong VBA, mình không rõ chức năng của module và class module có gì khác, giống nhau. Trường hợp nào ta dùng module, còn trường hợp nào dùng class module.
xin giải thích hộ mình với. Cảm ơn nhiều.
Đang định viết bài trả lời thì search thấy bài này của hai2hai đã trả lời 1 bài tương tự rồi.
Nếu các bạn làm quen với OOP (Object Oriented Programming) thì các bạn nên viết ứng dụng sử dụng "Module Class" vì viết thế vừa chuyên nghiệp, vừa mềm dẻo, vừa tốn ít bộ nhớ.
Thêm nữa, khi các đối tượng giao tiếp với nhau thì thường sử dụng Interface để giao tiếp. Các đối tượng trong lập trình cũng sử dụng các Interface Class để giao tiếp với nhau (eg: IEmployee, IGeneralLedger, IAcountPayable, v.v...).
Giả sử bạn muốn nhập thông tin của đối tượng có tên là nhân viên, sau khi thiết kế này nọ thì bạn có 1 dạng thiết kế là DB Design với chi tiết về bảng thông tin như sau:
tb_Employee
ID Long - PK
Code Varchar(20) - Unique Index
FirstName Varchar(30)
MiddleName Varchar(50)
LastName Varchar(30)
DOB DateTime
...
Khi đó, bạn sẽ có 1 Object Class chuyên làm nhiệm vụ cập nhật thông tin của Employee vào CSDL (Mà người ta hay gọi là DB Layer Class). Object đó có tên là clsDAEmployee (DA= Data Access Layer)
....
thôi, tớ đi ăn cơm cái. Lúc nào có time viết tiếp...
À, mà bạn tìm hiểu về cách viết ActiveX DLL đi, nói thế này dài lắm. Nếu ngồi ở chỗ tớ. 15 phút xong tất những khái niệm cơ bản.
Thôi, các bạn chịu khó tự tìm hiểu đi. Tớ muốn sống thì phải đi ăn trưa chứ. 12:30PM ko đi ăn thì chết đói à. Tớ còn tỷ việc kia kìa.
Giả sử bạn muốn nhập thông tin của đối tượng có tên là nhân viên, sau khi thiết kế này nọ thì bạn có 1 dạng thiết kế là DB Design với chi tiết về bảng thông tin như sau:
tb_Employee
ID Long - PK
Code Varchar(20) - Unique Index
FirstName Varchar(30)
MiddleName Varchar(50)
LastName Varchar(30)
DOB DateTime
...
Khi đó, bạn sẽ có 1 Object Class chuyên làm nhiệm vụ cập nhật thông tin của Employee vào CSDL (Mà người ta hay gọi là DB Layer Class). Object đó có tên là clsDAEmployee (DA= Data Access Layer)
....
thôi, tớ đi ăn cơm cái. Lúc nào có time viết tiếp...
Nhờ bạn mở thêm 1 topic trên diễn đàn về cái khoản lập trình hướng đối tượng này được không ạ! Tụi tui mù về cái ni quá, cách tạo ra 1 class như thế nào, thế rồi ứng dụng của nó để làm cho Excel nhà ta phong phú ra sao, ... bọn tui nghe cứ như "Vịt nghe sấm".
Mong bạn nhiệt tình chứ cứ nhá... xèng...., chốc lại đi ăn cơm, lát lại kiếm cái time thì chán chết.
Cảm ơn smbsolutions
Mình mơ màng hiểu được chút ít rồi. Mong smbsolutions tiếp tục post thêm ít kiến thức về vấn đề này lên diễn đàn cho anh em được nhờ nhé.
Tôi chưa biết bác levanduyet là ai nhưng biết chắc chắn levanduyet là người có rất nhiều đóng góp lớn cho diễn đàn này. Các thành viên như chúng tôi rất biết ơn bác levanduyet đấy smbsolutions ạ!
Rất cảm ơn Anh Smbsolutions, giờ thì đã hiểu được phần nào. Khi nào tương đối rãnh rỗi, mong anh tranh thủ cho vài bài viết hoặc ví dụ cụ thể hơn để em và nhiều người đang rất muốn học tập.
Xin cảm ơn Anh.
Bác levanduyet là bác nào mà sửa bài của mình thế nhỉ??? Mà tớ cũng chả nhớ trước đó viết gì nữa.
... tiếp nhé...
Thông thường khi làm việc với một đối tượng thì ra sẽ sử dụng các thuộc tính của đối tượng đó, các phương thức của đối tượng đó. Ví dụ: lớp Ô tô thì có những thuộc tính cơ bản là có 4 bánh, có vô lăng, có mui trần, có cửa kính, v.v...
Ô tô đó chạy được là phải có phương thức: Khởi động(), chạy(), v.v...
Ngoài ra, một số đối tượng còn có một số sự kiện (Evens) như các bạn hay làm với ActiveX.
Quay lại ví dụ class clsDAEmployee thì thông thường class này có những thuộc tính như là các trường trong table tb_Employee cũng như 1 vài thuộc tính phục vụ khác nữa.
Để cập nhật được vào CSDL thì thông thường lớp đối tượng đó phải kết nối (connect) vào CSDL, tức là có phương thức Connect(). Để thao tác với CSDL với các actions như CRUD (Create, Read, Update, Delete) thì trong lớp đó cũng có những Method tương tự (và thêm 1 vài methods nữa chứ ko chỉ có vậy).
Khi sử dụng đối tượng thì mình sử dụng như mọi người đã từng dùng.
eg:
Dim objDAEmployee AS clsDAEmployee
Set objDAEmployee = New clsDAEmployee
'// Delete Employee
objDAEmployee.ID = 1
If Not objDAEmployee.Delete() Then ....
if Not objDAEmployee Is Nothing Then Set objDAEmployee = Nothing
Đại khái là thế.
Đó mới chỉ là Data Access Layer. Ít khi chương trình sẽ gọi trực tiếp tới Data layer mà họ sẽ gọi qua lớp Interface và từ đó thông qua Business Layer để gọi tới Data Layer.
.....
Ôi, chả hiểu mình viết thế mọi người có đọc được ko. Ai đọc thấy vớ vẩn đừng trách tớ nhé. Bỏ qua đi. Thanks!
P/S: Ah, dĩ nhiên OOP thì ko chỉ đơn giản thế. Ngoài những thứ đó còn có vô số concepts như Abstract Class, Inheritance, Polymorphic, v.v.... nhưng có lẽ các bạn chả cần tìm hiều món đó đâu.
dvu58 đã viết:
Tôi chưa biết bác levanduyet là ai nhưng biết chắc chắn levanduyet là người có rất nhiều đóng góp lớn cho diễn đàn này. Các thành viên như chúng tôi rất biết ơn bác levanduyet đấy smbsolutions ạ!
À, thế chắc là cao thủ ẩn dật rồi. Vừa rồi tớ cũng đọc 1 số bài của bác levanduyet. Thế là tớ múa rìu qua mắt thợ rồi.
Ví dụ 1 DA Class, với tên Class là: CDTbMCountry (Hic, có mỗi cái class này là ngắn nhất thôi)
Mã:
Option Explicit
'*****************************************************************************
'* Use with MS SQL
'* Expects Table/View Based Data Object
'*
'*----------------------------------------------------------------------------
'*
'* Name: CDTbMCountry.cls
'*
'* Purpose: Standard database access class for table 'tb_M_Country'.
'*
'*----------------------------------------------------------------------------
'* This Class was created by
'* Modification Log:
'* ~~~~~~~~~~~~~~~~~
'* Date Created: 7/25/2003 11:58:27 AM
'* Modified by: smbSolutions
'*
'*****************************************************************************
Private Const MODULE_NAME = "CDTbMCountry"
Private m_nID As Long
Private m_sNameVN As String
Private m_sNameEN As String
Private m_sShortName As String
Private m_adoConn As ADODB.Connection '// adoConn property.
Private mXMLFile As String '// XMLFile property.
Private mClipString As String '// ClipString property.
Public Property Let ClipString(ByVal vClipString As String)
mClipString = vClipString
End Property
Public Property Get ClipString() As String
ClipString = mClipString
End Property
Public Property Let XMLFile(ByVal vXMLFile As String)
mXMLFile = vXMLFile
End Property
Public Property Get XMLFile() As String
XMLFile = mXMLFile
End Property
Public Property Set adoConn(NewAdoConn As ADODB.Connection)
Set m_adoConn = NewAdoConn
End Property
Public Property Get adoConn() As String
adoConn = m_adoConn
End Property
Public Property Let ID(NewID As Long)
m_nID = NewID
End Property
Public Property Get ID() As Long
ID = m_nID
End Property
Public Property Let NameVN(NewNameVN As String)
m_sNameVN = NewNameVN
End Property
Public Property Get NameVN() As String
NameVN = m_sNameVN
End Property
Public Property Let NameEN(NewNameEN As String)
m_sNameEN = NewNameEN
End Property
Public Property Get NameEN() As String
NameEN = m_sNameEN
End Property
Public Property Let ShortName(NewShortName As String)
m_sShortName = NewShortName
End Property
Public Property Get ShortName() As String
ShortName = m_sShortName
End Property
Public Function GetData() As Boolean
'******************************************************************************
'* *
'* Name: GetData *
'* *
'* Purpose: Get the specified record. If found, return record details in *
'* field properties. Properties are optional so procedure *
'* will return only those attributes that are required. *
'* *
'* Returns: Boolean - True (record found); False (otherwise). *
'* *
'******************************************************************************
On Error GoTo PROC_ERROR
Dim strSQL As String
Dim rsGetData As ADODB.Recordset
Const CST_FLD_ID = 0
Const CST_FLD_NAMEVN = 1
Const CST_FLD_NAMEEN = 2
Const CST_FLD_SHORTNAME = 3
'// Initialise recordset
Set rsGetData = New ADODB.Recordset
'// SQL 'SELECT' string
'// Only select records that match the key passed in
strSQL = "SELECT"
strSQL = strSQL & " ID,"
strSQL = strSQL & " NameVN,"
strSQL = strSQL & " NameEN,"
strSQL = strSQL & " ShortName"
strSQL = strSQL & " FROM tb_M_Country"
strSQL = strSQL & " WHERE "
strSQL = strSQL & " ID = " & m_nID
'// Ensure recordset uses an 'adClient' cursor
rsGetData.CursorLocation = adUseClient
'// Set active connection to recordset
Set rsGetData.ActiveConnection = m_adoConn
'// Open recordset
rsGetData.Open strSQL, , adOpenForwardOnly, adLockReadOnly
'// Map data to output field properties
'//If rsGetData.RecordCount Then
If Not rsGetData.BOF And Not rsGetData.EOF Then
rsGetData.MoveFirst
m_nID = CheckOutputNull(rsGetData(CST_FLD_ID))
m_sNameVN = CheckOutputNull(rsGetData(CST_FLD_NAMEVN))
m_sNameEN = CheckOutputNull(rsGetData(CST_FLD_NAMEEN))
m_sShortName = CheckOutputNull(rsGetData(CST_FLD_SHORTNAME))
GetData = True
'// Record not found - return False
Else
GetData = False
End If
'// Detach cursor from database connection
Set rsGetData.ActiveConnection = Nothing
'// Cleanup
If Not rsGetData Is Nothing Then
If rsGetData.State = adStateOpen Then
rsGetData.Close
End If
Set rsGetData = Nothing
End If
PROC_DONE:
Exit Function
PROC_ERROR:
Call Process_Error(MODULE_NAME, "GetData")
Resume PROC_DONE
End Function
Public Function GetAll(Optional ByVal vstrMyCriteria As Variant, _
Optional ByVal vstrMyOrder As Variant, _
Optional ByVal strXMLTitle As String = "") As ADODB.Recordset
'******************************************************************************
'* *
'* Name: GetAll *
'* *
'* Purpose: Get all records according to specified criteria. *
'* *
'* Returns: A detached ADO recordset object containing the specified data. *
'* *
'******************************************************************************
On Error GoTo PROC_ERROR
Dim strSQL As String
Dim rsGetAll As ADODB.Recordset
'// Initialise recordset
Set rsGetAll = New ADODB.Recordset
'// SQL 'SELECT' string
strSQL = "SELECT"
strSQL = strSQL & " ID,"
strSQL = strSQL & " NameVN,"
strSQL = strSQL & " NameEN,"
strSQL = strSQL & " ShortName"
strSQL = strSQL & " FROM tb_M_Country"
strSQL = strSQL & " WHERE "
'// Criteria - use 'AND'
If Not IsMissing(vstrMyCriteria) Then strSQL = strSQL & Space(1) & vstrMyCriteria
'// Lose 'WHERE' clause and last 'AND' if not used
strSQL = Trim(strSQL)
If Right(strSQL, 5) = "WHERE" Then strSQL = Left(strSQL, Len(strSQL) - 5)
If Right(strSQL, 3) = "AND" Then strSQL = Left(strSQL, Len(strSQL) - 3)
If Not IsMissing(vstrMyOrder) Then strSQL = strSQL & " ORDER BY " & vstrMyOrder
'// Lose 'ORDER BY' clause
strSQL = Trim(strSQL)
If Right(strSQL, 8) = "ORDER BY" Then strSQL = Left(strSQL, Len(strSQL) - 8)
'// Ensure recordset uses an 'adClient' cursor
rsGetAll.CursorLocation = adUseClient
'// Set active connection to recordset
Set rsGetAll.ActiveConnection = m_adoConn
'// Open recordset
rsGetAll.Open strSQL, , adOpenForwardOnly, adLockReadOnly
'// Detach cursor from database connection
Set rsGetAll.ActiveConnection = Nothing
'// Return the recordset
Set GetAll = rsGetAll
'// Save to XML, ClipString
If Len(strXMLTitle) <> 0 Then SaveRecordset rsGetAll, gstrXMLPath & strXMLTitle & ".XML", ClipString
'// Cleanup
Set rsGetAll = Nothing
PROC_DONE:
Exit Function
PROC_ERROR:
Call Process_Error(MODULE_NAME, "GetAll")
Resume PROC_DONE
End Function
Public Function GetDataBySQL(pstrSql As String, Optional ByVal strXMLTitle As String = "") As ADODB.Recordset
'******************************************************************************
'* *
'* Name: GetDataBySQL *
'* *
'* Purpose: Get records according to free sql sting *
'* *
'* Returns: A detached ADO recordset object containing the specified data. *
'* *
'******************************************************************************
On Error GoTo PROC_ERROR
Dim strSQL As String
Dim rsGetDataBySQL As ADODB.Recordset
'// Initialise recordset
Set rsGetDataBySQL = New ADODB.Recordset
'// SQL 'SELECT' string
strSQL = pstrSql
'// Ensure recordset uses an 'adClient' cursor
rsGetDataBySQL.CursorLocation = adUseClient
'// Set active connection to recordset
Set rsGetDataBySQL.ActiveConnection = m_adoConn
'// Open recordset
rsGetDataBySQL.Open strSQL, , adOpenForwardOnly, adLockReadOnly
'// Detach cursor from database connection
Set rsGetDataBySQL.ActiveConnection = Nothing
'// Return the recordset
Set GetDataBySQL = rsGetDataBySQL
'// Save to XML, ClipString
If Len(strXMLTitle) <> 0 Then SaveRecordset rsGetDataBySQL, gstrXMLPath & strXMLTitle & ".XML", ClipString
'// Cleanup
Set rsGetDataBySQL = Nothing
PROC_DONE:
Exit Function
PROC_ERROR:
Call Process_Error(MODULE_NAME, "GetDataBySQL")
Resume PROC_DONE
End Function
Public Function ExecuteByFreeSQL(ByVal strSQL As String) As Boolean
'******************************************************************************
'* *
'* Name: ExecuteByFreeSQL *
'* *
'* Purpose: Run free SQL statement. *
'* *
'* Returns: True (sucess) ; False (otherwise). *
'* *
'******************************************************************************
On Error GoTo PROC_ERROR
Dim cCMD As ADODB.Command
Dim lngRowsAffected As Long
'// Assume function fails
ExecuteByFreeSQL = False
'// Check if SQL string is valid
If Len(strSQL) = 0 Then GoTo PROC_DONE
Set cCMD = New ADODB.Command
'// Execute SQL
With cCMD
.ActiveConnection = m_adoConn
.CommandText = strSQL
.CommandType = adCmdText
.Execute lngRowsAffected
End With
'// All's well - return True
ExecuteByFreeSQL = True
PROC_DONE:
Exit Function
PROC_ERROR:
Call Process_Error(MODULE_NAME, "ExecuteByFreeSQL")
Resume PROC_DONE
End Function
Private Sub Class_Initialize()
Set m_adoConn = GetDBConnection
End Sub
Private Sub Class_Terminate()
Set m_adoConn = Nothing
End Sub
Đây là đoạn code hoàn toàn được generated bởi 1 công cụ mà trước kia hồi làm cùng công ty cũ với hai2hai tôi ... "chôm" được (không phải viết bằng tay một tý nào). Đùa tý, hồi đó bác đó khoe nên tớ xin ... mãi mới được.
Cám ơn Anh Smbsolutions. Thật sự em cũng vẫn còn rất mơ hồ (thật sự cố gắng đọc codes của anh chỉ hiểu được chút xíu xiu thôi) Nhưng em sẽ cố gắng tìm hiểu để học tập thêm. Cám ơn Anh đã nhiệt tình và mong Anh tiếp tục post bài hướng dẫn.
P/S : lần sau các bác sửa bài của người khác nhớ để lại lý do nhé. Như thế là tôn trọng đấy.
smbsolutions đã viết:
Đây là đoạn code hoàn toàn được generated bởi 1 công cụ mà trước kia hồi làm cùng công ty cũ với hai2hai tôi ... "chôm" được (không phải viết bằng tay một tý nào). Đùa tý, hồi đó bác đó khoe nên tớ xin ... mãi mới được.
Mấy cái công cụ này mình thấy rồi. Mình có 1 ông anh làm ở FPT Soft, (trước đây đã được giải quốc tế về vật lý), ông có trình diễn cho mình mấy lần.
Khi viết code thấy lười quá, thế là ông ấy ngồi viết 1 tool (khoảng 15 phút), sau đó đó chỉ cần mô tả, thể là nó tự viết code cho, khi đó ông ấy đang làm 1 dự án gì đó cho Anh (gia công phần mềm).
Đại khái thế, vì cách đây 6 năm rồi, lúc đó mình mới chỉ biết đánh máy cho đúng tên mình là giỏi lắm rồi, huống chi lại nghe ông ấy nói về đối tượng, thuộc tính, module . . nghe như đàn gảy tai trâu.
Chào bạn TranNguyenDanNhi,
Nếu bạn theo dõi sát thread này, bạn sẽ thấy tôi không hề sửa nội dung gì cả !
To:smbsolutions
Nếu bạn thật sự muốn hướng dẫn các bạn trong diễn đàn bạn nên trả lời một cách nhiệt tình, xin bạn đừng dùng "thôi, tớ đi ăn cơm" chẳng hạn. Làm cho các bạn khác "không vui" lắm...
Dvu58 đã viết:
Mong bạn nhiệt tình chứ cứ nhá... xèng...., chốc lại đi ăn cơm, lát lại kiếm cái time thì chán chết
Mấy cái công cụ này mình thấy rồi. Mình có 1 ông anh làm ở FPT Soft, (trước đây đã được giải quốc tế về vật lý), ông có trình diễn cho mình mấy lần.
Khi viết code thấy lười quá, thế là ông ấy ngồi viết 1 tool (khoảng 15 phút), sau đó đó chỉ cần mô tả, thể là nó tự viết code cho, khi đó ông ấy đang làm 1 dự án gì đó cho Anh (gia công phần mềm).
Đại khái thế, vì cách đây 6 năm rồi, lúc đó mình mới chỉ biết đánh máy cho đúng tên mình là giỏi lắm rồi, huống chi lại nghe ông ấy nói về đối tượng, thuộc tính, module . . nghe như đàn gảy tai trâu.
Bên đó (FSoft) tôi quen thế hệ trước nhiều lắm DanNhi à. Codegen thì có rất nhiều công cụ trên thế giới này. Hiện nay có rất nhiều công cụ Codegen cho .NET với những framework đã được chứng minh. Những cái đó như những "máy cái" trong môi trường sản xuất, vừa làm cho SP chuyên nghiệp lên, vừa làm giảm chi phí, tăng năng suất sản xuất.
levanduyet đã viết:
To:smbsolutions
Nếu bạn thật sự muốn hướng dẫn các bạn trong diễn đàn bạn nên trả lời một cách nhiệt tình, xin bạn đừng dùng "thôi, tớ đi ăn cơm" chẳng hạn. Làm cho các bạn khác "không vui" lắm...
Có lẽ bác ko rõ cách viết bài của tôi, của sanfrontier (tức quickquickslow), iso, sunf, vualua, ketoan@, v.v... trên webketoan (vì hầu hết những thành viên cứng trên GPE đều xuất phát từ box Excel bên đó nên chắc biết những người đó - tôi tham gia wkt từ hồi mới thành lập nhưng giờ cũng ko còn lên đó nữa do chất lượng bài viết ngày càng mai một). Một khi đang viết dở, phải dừng lại giữa chừng vì có việc gì đó thì phải để lại lý do, sau đó viết tiếp thì xóa bỏ lý do đó đi. Đó là cách viết bài rất tự nhiên, mang phong cách nói chuyện gần gũi, ko khô cứng.
Vì viết một bài tâm huyết cực tốn thời gian (nào là đúng văn phong viết bài, nào là không được sai chính tả, nào là phân đoạn cho dễ đọc, nào là sửa từ sao cho đúng,...). Mà tôi thường viết vào lúc tranh thủ trong khi làm việc (tôi làm 14h/24h/ngày).
Nhưng khi chưa viết xong thì tôi phải post tạm thời phần đang viết dở và phải đưa lý do tạm thời để người đọc hiểu là tôi sẽ còn post tiếp (để họ khỏi thắc mắc sao đang viết dở dang thì dừng lại). Khi nào viết tiếp vào bài đó tôi sẽ xóa phần giải thích đoạn lý do đó đi để cho liền mạch. Nếu các bạn để ý sẽ thấy hầu hết bài nào tôi cũng phải chỉnh sửa lại rất nhiều lần.
Đến giờ này, sau rất nhiều lần nghiên cứu về sự phù hợp với phong cách của diễn đàn, mặc dù đã có cố gắng viết tiếp khi đọc bài của Obak... nhưng có thể do khả năng kiến thức excel của tôi là rất hạn chế nên tôi cảm thấy mình rất mệt mỏi & buồn mỗi lần vào đọc những bài trả lời. Đặc biệt là sự ảnh hưởng rất nhiều tới sức khỏe và thời gian làm việc của tôi kể từ ngày bắt đầu tham gia post bài (vì tôi viết bài hay bỏ hết tâm sức vào từng câu từng chữ một).
Tôi khẳng định sẽ theo chân hai2hai để giữ gìn sức khỏe. (Mọi người thông cảm vì quả thật ko hiểu sao tôi rất mệt và thấy rất ảnh hưởng tới công việc hiện thời)
Chúc mọi người vui vẻ và học được nhiều kiến thức trên diễn đàn.
Mình thấy cách viết của bác khá chuyên nghiệp và mặc dù rất bận nhưng bác vẫn cố gắng dành thời gian post bài trên diễn đàn này. Chân thành cảm ơn - Chúc bác luôn vui vẻ !
Vì viết một bài tâm huyết cực tốn thời gian (nào là đúng văn phong viết bài, nào là không được sai chính tả, nào là phân đoạn cho dễ đọc, nào là sửa từ sao cho đúng,...). Mà tôi thường viết vào lúc tranh thủ trong khi làm việc (tôi làm 14h/24h/ngày).
Đồng ý với bạn. Qua các bài viết của bạn các thành viên khác cũng biết được khả năng của bạn.
Rất mong bạn tiếp tục chia sẻ kiến thức của mình với GPE.
Bên đó (FSoft) tôi quen thế hệ trước nhiều lắm DanNhi à. Codegen thì có rất nhiều công cụ trên thế giới này. Hiện nay có rất nhiều công cụ Codegen cho .NET với những framework đã được chứng minh. Những cái đó như những "máy cái" trong môi trường sản xuất, vừa làm cho SP chuyên nghiệp lên, vừa làm giảm chi phí, tăng năng suất sản xuất.
Có lẽ bác ko rõ cách viết bài của tôi, của sanfrontier (tức quickquickslow), iso, sunf, vualua, ketoan@, v.v... trên webketoan (vì hầu hết những thành viên cứng trên GPE đều xuất phát từ box Excel bên đó nên chắc biết những người đó - tôi tham gia wkt từ hồi mới thành lập nhưng giờ cũng ko còn lên đó nữa do chất lượng bài viết ngày càng mai một). Một khi đang viết dở, phải dừng lại giữa chừng vì có việc gì đó thì phải để lại lý do, sau đó viết tiếp thì xóa bỏ lý do đó đi. Đó là cách viết bài rất tự nhiên, mang phong cách nói chuyện gần gũi, ko khô cứng.
Vì viết một bài tâm huyết cực tốn thời gian (nào là đúng văn phong viết bài, nào là không được sai chính tả, nào là phân đoạn cho dễ đọc, nào là sửa từ sao cho đúng,...). Mà tôi thường viết vào lúc tranh thủ trong khi làm việc (tôi làm 14h/24h/ngày).
Nhưng khi chưa viết xong thì tôi phải post tạm thời phần đang viết dở và phải đưa lý do tạm thời để người đọc hiểu là tôi sẽ còn post tiếp (để họ khỏi thắc mắc sao đang viết dở dang thì dừng lại). Khi nào viết tiếp vào bài đó tôi sẽ xóa phần giải thích đoạn lý do đó đi để cho liền mạch. Nếu các bạn để ý sẽ thấy hầu hết bài nào tôi cũng phải chỉnh sửa lại rất nhiều lần.
Đến giờ này, sau rất nhiều lần nghiên cứu về sự phù hợp với phong cách của diễn đàn, mặc dù đã có cố gắng viết tiếp khi đọc bài của Obak... nhưng có thể do khả năng kiến thức excel của tôi là rất hạn chế nên tôi cảm thấy mình rất mệt mỏi & buồn mỗi lần vào đọc những bài trả lời. Đặc biệt là sự ảnh hưởng rất nhiều tới sức khỏe và thời gian làm việc của tôi kể từ ngày bắt đầu tham gia post bài (vì tôi viết bài hay bỏ hết tâm sức vào từng câu từng chữ một).
Tôi khẳng định sẽ theo chân hai2hai để giữ gìn sức khỏe. (Mọi người thông cảm vì quả thật ko hiểu sao tôi rất mệt và thấy rất ảnh hưởng tới công việc hiện thời)
Chúc mọi người vui vẻ và học được nhiều kiến thức trên diễn đàn.
Mong rằng GPE vẫn còn những người có nhiệt tâm và trình độ như bác.
Trong một thế giới phẳng với thông tin đa chiều là một việc rất bình thường, hơn nữa đây chỉ là những thông tin một chiều (chỉ có điều đã bị phân lớp).
Mình rất mong bác luôn còn lý do để đem kiến thức giúp mọi người. Và mình luôn hoan hô điều này. Về lập trình thì mình mù tịt, nhưng ít ra về Xã hội thì cũng không đến nỗi là chú chuột chũi trong góc bếp
Hôm nào có dịp ra HN hoặc bác vào SG, mong sẽ được ngồi lai rai với bác bàn về Cổ Kim, về IT, về kinh doanh, về rượu, về thơ ca, về nhậu . . . .
ĐT: 0983.009157; email: hieu1563@gmail.com