Nối giá trị trong các dòng của một cột thành một chuỗi cách nhau bởi dấu phẩy và ngược lại

Vấn đề: Trong nhiều tình huống làm việc với SQL, bạn muốn ghép giá trị trong một cột của table thành một chuỗi cách nhau bởi dấu phẩy cho mục đích nào đó, hoặc ngược lại.

Giải quyết: Chúng ta sẽ tạo bảng, insert một số dòng vào bảng, sau đó thực hiện theo yêu cầu đặt ra như trên.

Đọc thêm »

Chia sẻ một vài kinh nghiệm lập trình Winform

Trrong quá trình làm việc với vị trí như một người phát triển sản phẩm, tôi có một số kinh nghiệm muốn chia sẽ cho những người mới làm quen như sau.
Xin giới thiệu mình cũng khá rành về SQL Server, từ trước đến nay từng lập trình trên Fox và C#, kinh nghiệm triển khai phần mềm kế toán và SAP Business One từ năm 2006 đến nay, hiện vẫn viết Winform App bằng C# và SQL cho một công ty phần mềm tại TPHCM.

Với các control, hồi mới làm quen với C#, mình mê mẩn với bộ công cụ DevExpress, phải công nhận là công cụ của nó cực đẹp và dễ dùng. Sau này có kinh nghiệm hơn một chút, và đi làm thực tế, khách hàng và kể cả công ty mình khá tôn trọng bản quyền phần mềm (khá thôi nhé), do đó dần dần mình hình thành một quan điểm là hạn chế tối đa xài đồ chùa, đồ crack hết mức có thể. Từ đó mình nhận ra rằng DevExpress thì đẹp thật, nhưng tiền mua thì không có, mà crack thì lại phạm vào tinh thần tôn trọng bản quyền, từ đó mình tìm cách từ bỏ các bộ công cụ của bên thứ 3, phần vì mặc dù đẹp và dễ dùng nhưng về cơ bản là có nhiều thứ mình không cần xài đến, lại làm nặng chương trình, và đặc biệt là phải mua hoặc crack, về lâu về dài, khi người dùng Việt Nam bắt đầu có ý thức tôn trọng bản quyền cao hơn thì những thứ đó cần phải tính đến.
Tuy nhiên, bộ control có sẵn của .Net dù khá đầy đủ nhưng vẫn còn nhiều hạn chế, ở đây mình chia sẻ hai hạn chế cơ bản của hai control sau:

TreeView: theo quan điểm cá nhân của mình thì cái TreeView này có vẻ như Microsoft không đầu tư để viết cho nó đàng hoàng, trên bản .Net 3.5 mình muốn mỗi node có một icon là coi như bó tay (hoặc có thể mình chưa biết làm), các bản sau thì không biết thế nào. Và đặc biệt, nếu datasource của mình có nhiều hơn hai thuộc tính (hai cột trở lên đối với DataTable) thì cũng bó tay nốt, trong khi đó với TreeView của DevExpress thì vô cùng đơn giản, gán dataSoure, ParentColumn, Childrend column là xong, lại có cả Binding nữa.
Nhưng xài của DevExpress thì lại vi phạm vào những thứ như mình nói ở trên, với lại cả bộ DevExpress đồ sộ như vậy chẳng lẽ lại chỉ xài có mỗi một control TreeView, mà có muốn xài một TreeView đi nữa thì cũng phải add 3,4 file đi kèm rất nặng. Cho nên mình đã thay thế nó bằng TreeAdvance hoàn toàn miễn phí trên codeproject.com, các bạn search từ khóa này sẽ ra, chịu khó nghiên cứu cách sử dụng một ít nữa thì xài rất thoải mái, lại gọn nhẹ, có cả source cho các bạn nghiên cứu nến chịu khó. Chi tiết tham khảo tại: http://www.codeproject.com/Articles/14741/Advanced-TreeView-for-NET
Hình minh họa cho project mình đang làm:

DataGridView: Control này thì quá đủ cho chúng ta xài, tuy nhiên khi datasource có dữ liệu lớn, khoảng 10.000 đến 100.000 dòng trở lên thì control này build lại rất chậm, nhưng khi thay thế nó bằng ObjectListView  thì nó build gần như là ngay lập tức, do đó, để view khối lượng dữ liệu lớn, bạn có thể sử dụng ObjectListView thay thế cho DataGridView. Theo mình đây là một trong những control miễn phí tuyệt vời nhất. Chi tiết mời bạn tham khảo tại: http://www.codeproject.com/Articles/16009/A-Much-Easier-to-Use-ListView

Một vấn đề nữa với DataGridView là có nhiều khi bạn muốn chọn giá trị từ một danh sách có sẵn, danh sách thì tùy, có loại danh sách đơn giản, nhỏ, thì có thể sử dụng column kiểu ComboBox là đủ, nhưng với danh sách dạng lớn thì làm thế nào, bạn muốn có một button bên trong Cell để chọn như DevExpress có thể làm? Điều này thì DataGridView không có, khi này bạn có thể thay đổi suy nghĩ một chút, không được vậy thì thêm vào một column bên cạnh, kiểu là button, với thuộc tính Width nhỏ thôi, vậy là người dùng chỉ cần click vào đó là có thể chọn danh sách được rồi, nó không đẹp bằng DevExpress nhưng cũng không tệ chút nào, thậm chí là khá đẹp. Như ví dụ sau

Report: Có một số bạn có quan điểm rất sai lầm là coi nhẹ việc viết và thiết kế báo cáo, nhưng theo mình, đó là việc quan trọng, nếu không muốn nói là gần như quan trọng nhất, bạn nhập liệu và lưu trữ, nhưng nếu không trình bày được dữ liệu đó ra theo những định dạng như nhà quản lý yêu cầu thì phần mềm của bạn chỉ mới đạt được 2/3 chương trình đó là thu thập và lưu trữ dữ liệu, chứ chưa thể đóng vai trò phân tích dữ liệu được. Do đó, một phần mềm được coi là mạnh không chỉ tiện dụng ở việc thu lập và lưu trữ, mà còn phải xuất dữ liêu đó ra theo các báo cáo với các tiêu chí và mục đích khác nhau của nhà quản lý. Do đó, việc lựa chọn công cụ để thiết kế báo cáo cũng cực kỳ quan trọng không kém.

Theo mình thấy, trong .Net hiện nay có hai control cho thiết kế report là Crystal Report và Report Control. Ý kiến của mình là nên sử dụng Report Control của Microsoft hơn. Report Control theo mình được biết thì ra đời sau Crystal Report, và Crystal Report cũng đã không còn là của Microsoft nữa mà được bán lại cho SAP từ lâu, Microsoft tập trung phát triển Reporting Service để thay thế cho Crystal Report, và Report Control là phiên bản rút gọn của Reporting Service. Bản này dễ sử dụng hơn rất nhiều. Mình từng thiết kế report trên Fox, Access, Active Report, Crystal Report, nhưng mình chưa thấy cái nào có thể làm tốt như Report Control trên .net cả. Với hệ thống phần mềm lớn với số lượng hàng trăm, hàng nghìn báo cáo thì control này sẽ tiết kiệm được lượng lớn thời gian cho các bạn làm được nhiều việc khác.

Bên cạnh đó, do các ứng dụng lớn có rất nhiều báo cáo, nếu bạn đang không dùng Reporting Service của MS thì bạn cũng nên tạo một cơ chế để tạo được tham số động để chạy các store lấy dữ liệu, vì thông thường các báo cáo cũng rất thường xuyên thay đổi, thêm bớt tham số… Điều này sẽ tiết kiệm được rất nhiều thời gian và giảm thiểu sự nhàm chán.

– Connection: Việc kết nối từ Client đến SQL Server có thể theo cơ chế xác thực của Window hoặc của SQL, của Window thì bảo mật hơn, nhưng đồng nghĩa với việc khi triển khai bạn sẽ gặp khó khăn hơn do các máy phải đảm bảo kết nối thông suốt được với nhau trong mạng nội bộ hoặc thông qua VPN. Window xác thực cũng tránh cho việc những máy tính không nằm trong mạng của bạn không thể động chạm đến dữ liệu. Trường hợp không có VPN hoặc khó khăn trong việc triển khai cơ chế này, bắt buộc bạn phải NATing router, mở port SQL 1433 thì có thể tham khảo ở đây. Nếu bạn không muốn NAT và mở port SQL, tốt hơn là sử dụng một WCF service được host trên IIS và mọi hoạt động ở Client đều được kết nối thông qua Service này….

– Menu: Với chương trình lớn, việc thay đổi, cập nhật menu diễn ra thường xuyên. Để làm nhanh hơn, bạn nên tạo ra một cơ chế có thể tạo menu động, toàn bộ thông tin của Menu sẽ được lưu trữ dưới database, mỗi lần thêm, bớt, sửa đổi bạn chỉ cần cập nhật nó thông qua giao diện là được, kinh nghiệm của tôi là làm điều này sẽ tiết kiệm rất nhiều thời gian.

Nguồn: http://www.bigdata.com.vn/

Đồng bộ dữ liệu giữa hai bảng trong SQL Server

Trên thực tế có nhiều tình huống các ứng dụng cần đồng bộ dữ liệu giữa các table với nhau điển hình như:

– Ứng dụng với CSDL phân tán.
– Ứng dụng Data Warehouse cần nhận biết dữ liệu update, insert để làm mới dữ liệu.

Cách truyền thống để so sánh sự thay đổi dữ liệu từ bảng nguồn so với bảng đích là so sánh giá trị trên từng field của từng dòng trong table, kỹ thuật này rất thủ công và cũng rất chậm và tốn nhiều thời gian cũng như tài nguyên hệ thống.

Đọc thêm »

Phần mềm cắt nhạc tốt nhất (miễn phí)

Có nhiều lúc bạn muốn chia nhỏ file audio hoặc file video cho một mục đích nào đó như để làm nhạc chuông điện thoại, để gép vào một file khác nhằm mục đích giải trí, chia nhỏ file sách audio thành từng chương, mục cho mục đích dễ quản lý và học tập…
Bên cạnh các phần mềm chuyên nghiệp mà bạn có thể mua nếu thấy cần thiết, thì cũng có rất nhiều phần mềm miễn phí mà chất lượng làm việc cũng rất tốt mà bạn có thể tại về dùng không giới hạn. Sau đây xin giới thiệu với bạn 3 phần mềm sau: 

1. Slice Audio Splitter 2 (Download)

Dùng phần mềm này để chia nhỏ file MP3 thành các file nhỏ hơn với số lượng file do bạn định nghĩa hoặc số lượng file mà phần mềm này thấy cần thiết. 

Điểm mạnh của chương trình này là có khả năng nhận diện những điểm ngắt quãng của file và cắt ngay tại đó, ví dụ như file audio book gồm nhiều chương, ở giữa mỗi chương là một quãng nghỉ thì chương trình sẽ biết và cắt file ở chỗ này…

2. MP3 Cutter (Download)

Một chương trình đơn giản, dễ dùng, gọn nhẹ và rất nhanh cho phép bạn lựa chọn phần mình muốn và lưu thành một file MP3 riêng biệt chỉ với vài cú click chuột.


3. Data Doctor Audio Splitter 2 (Download)
Định dạng được hỗ trợ: MP2, MP3, WAV, WMV và dễ sử dụng phù hợp mọi đối tượng dù có kinh nghiệm hay chưa.

Điểm mạnh: giao diện thân thiện dễ dùng, bạn có thể Browse đến file bận cần cắt, chọn điểm bắt đầu, điểm kết thúc hoặc thời gian, rồi có thể nghe trước đoạn audio mình cần cắt ngay trên chương trình. Sau khi đúng yêu cầu của bạn thì chọn folder lưu trữ và thực hiện cắt file. Chương trình gọn nhẹ, không chiếm nhiều tài nguyên và thời gian xử lý cũng tương đối nhanh.

Điểm yếu: Chỉ có thể chọn file mà không kéo thả vào chương trình được.  Cũng không xử lý được cùng lúc nhiều file.

SQL Server: Sử dụng OPENXML trong SQL Server

Ứng dụng XML trong SQL khá đa dạng, trong bài này chúng ta sẽ giải quyết tình huống như sau:
Bạn viết một ứng dụng trên .Net, trên 1 form nào đó của bạn người dùng sẽ nhập một số thông tin, những thông tin đó sẽ được lưu vào một một hoặc nhiều table trên SQL Server (ví dụ: form "Hóa đơn bán hàng" dữ liệu sẽ lưu vào table Invoice và InvoiceDetail), giả sử như bạn muốn chuyển tất cả dữ liệu người dùng đã nhập vào form thành một chuỗi XML và gửi nó đến server, sau đó SQL Server sẽ đọc, bóc tách xử lý và update dữ liệu từ chuỗi XML này vào các table tương ứng trong database.
Đồng thời bạn muốn gói gọn các hành động insert, update và delete vào một stored procedure duy nhất để dễ quản lý mà không muốn viết riêng từng thủ tục cho từng hành động một vừa mất thời gian lại phức tạp trong việc bảo trì code.
Chưa nói đến lợi hại của kỹ thuật này, trước hết chúng ta hãy giải quyết bài toán trên bằng cách sử dụng hàm OPENXML trong SQL Server.

Đọc thêm »

SQLite cơ bản (phần 3): Xây dựng ứng dụng với C# và SQLite

Ở phần này cũng là phần cuối trong loạt bài về SQLite, tôi sẽ xây dựng một ứng dụng nhỏ nhằm demo việc sử dụng C# với SQLite. Chúng ta sẽ sử dụng thư viện System.Data.SQLite được cung cấp sẵn trên trang http://sqlite.org/download.html, bạn tìm đến mục Precompiled Binaries for .NET download về và cài đặt, chương trình sẽ tự động tích hợp vào phần Toolbox của Visual Studio. Tuy nhiên, ở đây sau khi cài đặt, bạn hãy tìm đến file System.Data.SQLite trong thư mục C:\Program Files\SQLite.NET\bin, copy file này vào thư mục project tạo bởi C#. Cách sử dụng thư viện này cực kỳ đơn giản nếu bạn đã làm quen với ADO.NET.

Đọc thêm »

SQLite: Kiến thức cơ bản (Phần 1)

Mặc dù blog này chủ yếu viết về SQL Server, tuy nhiên trong công việc gần đây tôi có yêu cầu cần phải nghiên cứu một ít liên quan đến các HQTCSDL khác, tìm hiểu một ít về SQLite thấy có một số điều thú vị nên mở thêm một mục liên quan đến nó, sẽ tranh thủ viết một vài bài cho những ai quan tâm. Thực sự phải nói là SQLite cực kì đơn giản, dễ hiểu, đặc biệt cho những ai đã biết về một HQTCSDL nào đó nhự Access, SQL Server…

Trước hết, ta tìm hiểu:
SQLite là gì?
Theo trang sqlite.com, SQLite là một thư viện thực thi các chức năng của một database engine với đặc điểm giống như một phần mềm portable, không cần cài đặt, không cần cấu hình, không cần server, những điểm này rất khác so với việc sử dụng SQL Server hoặc Oracle, nhưng nó vẫn có transaction để đảm bảo tính toàn vẹn và an toàn trong quá trình thao tác dữ liệu. Có thể so sánh nó có một vài điểm giống với Access, nhưng nhìn chung vẫn có nhiều sự khác biệt.

SQLite được đánh giá là nhanh, tin cậy và đặc biệt là làm cho trở nên đơn giản nhất cho việc học và sử dụng nó. 

Đọc thêm »

Running total (tạm dịch Tổng lũy kế theo chiều dọc)

Running total là kỹ thuật tính toán tổng lũy kế theo chiều dọc của một table, như minh họa sau:

Ứng dụng của Running total rất phổ biến, như tính toán tổng lũy kế doanh thu theo từng ngày, từng nhân viên, từng mặt hàng, tồn kho theo từng lần nhập xuất chi tiết theo hàng hóa và theo ngày, lũy kế tài khoản theo mỗi nghiệp vụ kinh tế phát sinh….
Nhiều lập trình viên thực hiện tính running total đơn giản bằng cách lặp qua từng dòng và dùng câu lệnh update để tính giá trị, nhưng với số dòng rất lớn thì có thể ảnh hưởng đến hiệu suất thực thi.

Ở đây chúng ta sẽ dùng một câu lệnh update duy nhất để tính runining total cho toàn bảng.
Trước hết, hãy tạo và insert một số dòng vào bảng để test:

Đọc thêm »

Business Intelligence (BI – Kinh doanh thông minh) là gì?

Business Intelligence là một cơ sở hạ tầng công nghệ nhằm đạt được tối đa THÔNG TIN từ hệ thống DỮ LIỆU có sẵn nhằm thúc đẩy và cải thiện  quy trình sản xuất kinh doanh của tổ chức, doanh nghiệp. Thành phần cơ bản của một cơ sở hạ tầng BI thường bao gồm hệ thống các ứng dụng để thu thập, làm sạch, tích hợp, phân tích và chia sẻ dữ liệu. BI tạo ra các thông tin đáng tin cậy và đã được phân tích nhằm giúp nhà quản trị đưa ra được những quyết định chiến lược có chất lượng và hiệu quả cao nhất có thể được.

Các hệ thống BI thông dụng nhất có thể kể đến:

  • EIS – Executive Information Systems ( hệ thống thông tin điều hành)
  • DSS – Decision Support Systems (Hệ thống hỗ trợ ra quyết định)
  • MIS – Management Information Systems (Hệ thống thông tin quản lý)
  • GIS – Geographic Information Systems(Hệ thống thông tin địa lý )
  • OLAP – Online Analytical Processing and multidimensional analysis (Xử lý dữ liệu trực tuyến và phân tích đa chiều)
  • CRM – Customer Relationship Management (Quản lý quan hệ khách hàng).
  • Một hệ thống BI thường dựa trên công nghệ Data Warehouse. Một Data Warehouse thu thập thông tin từ một tập hợp rộng lớn nhiều hệ thống thông tin khác nhau trong doanh nghiệp, BI dựa vào đó để hoàn thiện chức năng của mình. Dữ liệu được tải xuống Data Warehouse thường là dữ liệu có chất lượng đã được làm sạch và tích hợp để sản xuất ra những thông tin đáng tin cậy và phản ánh một phiên bản của sự thật về tình hình hoạt động sản xuất kinh doanh của toàn bộ doanh nghiệp.

    Nguồn: http://datawarehouse4u.info