• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Nhờ giúp nhập dữ liệu theo chiều doc in theo chiều ngang

Chuyên mục thảo luận các vấn đề liên quan đến ứng dụng quản lý và cơ sở dữ liệu

Moderator: Điều hành

muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Posts: 541
Joined: Fri 26/11/2010 1:15 pm
Location: TP.HCM
Has thanked: 189 times
Been thanked: 33 times
Contact:

Nhờ giúp nhập dữ liệu theo chiều doc in theo chiều ngang

Postby muaphonui_2010 » Tue 21/01/2014 9:37 am

Nhờ các bạn giúp mình với.
Mình nghĩ vấn đền này chắc có lẽ khó và không biết có logic để làm dc hay ko nữa.
Mình có 1 bảng dữ liệu (Table) có cấu trức và dữ liệu như hình sau.
Image
Có code hay cấu SQL nào để nó ra được dữ liệu theo chiều ngang (lấy cột size trải dài theo chiều ngang lên trên)
kết quả bản in như hình dưới.
Image
Cảm ơn các bạn.



muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Posts: 541
Joined: Fri 26/11/2010 1:15 pm
Location: TP.HCM
Has thanked: 189 times
Been thanked: 33 times
Contact:

Re: Nhờ giúp nhập dữ liệu theo chiều doc in theo chiều ngang

Postby muaphonui_2010 » Tue 21/01/2014 10:21 am

Mình tìm thấy code này. nhưng code này nó "Tĩnh" chứ ko "động" theo size dc. (Vì size nó không cố định, do ng dùng định nghĩa).

Code: Select all

SELECT mahang, dvt, mau, [35] AS '35', [36] AS '36', [40] AS '40'
FROM
(SELECT mahang, dvt, mau, size, soluong
FROM Table_1 ) ps
PIVOT
(SUM (soluong)
FOR size IN
( [35], [36], [40])
) AS pvt

==> code này cái Size 35,36,40 nó không "động dc, vì có thể có nhiều size nữa chứ ko phải cố định 3 size này.
Mong được giúp đỡ

cuibaphp
Thành viên chính thức
Thành viên chính thức
Posts: 30
Joined: Tue 04/09/2012 3:04 pm
Been thanked: 15 times

Re: Nhờ giúp nhập dữ liệu theo chiều doc in theo chiều ngang

Postby cuibaphp » Tue 21/01/2014 10:37 am

Bạn muốn 'động' thì dùng Building Dynamic SQL đó :D

  1. DECLARE @SQL AS NVARCHAR(500)
  2. DECLARE @ColSize AS NVARCHAR(500)
  3.  
  4. SET @ColSize = (SELECT STUFF(
  5.     (SELECT DISTINCT ', ' + quotename([SIZE], ']') FROM Table_1 FOR XML PATH('')), 1, 1, ''))
  6.  
  7. SET @SQL = ' SELECT * FROM
  8.             (SELECT mahang,dvt,mau,soluong,[size] FROM Table_1)s1
  9.                 PIVOT (
  10.                     SUM(soluong) FOR [size] IN (' + @ColSize + ')              
  11.                 )s2'
  12.  
  13. EXECUTE( @SQL)

muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Posts: 541
Joined: Fri 26/11/2010 1:15 pm
Location: TP.HCM
Has thanked: 189 times
Been thanked: 33 times
Contact:

Re: Nhờ giúp nhập dữ liệu theo chiều doc in theo chiều ngang

Postby muaphonui_2010 » Tue 21/01/2014 2:03 pm

CẢM ƠN BẠN NHIỀU.
Mình đã làm theo code của bạn dc rồi, mình làm như sau:

Code: Select all

  Try
            Dim adapter As New SqlDataAdapter()

            Dim cmd As New SqlCommand("causql1", connect)
            cmd.CommandType = CommandType.StoredProcedure

            adapter.SelectCommand = cmd
            Dim dt As New DataTable()
            adapter.Fill(dt)

            connect.Open()
            cmd.ExecuteNonQuery()
            connect.Close()
            cmd.Dispose()
            GridControl1.DataSource = dt
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

Nếu bạn thêm cho mình được cột Sum ở cuối cùng thì thật là tuyệt, nhưng thấy như trên vẫn thỏa mãn, xung xướng lắm rồi.
Chân thành cảm ơn bạn.

muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Posts: 541
Joined: Fri 26/11/2010 1:15 pm
Location: TP.HCM
Has thanked: 189 times
Been thanked: 33 times
Contact:

Re: Nhờ giúp nhập dữ liệu theo chiều doc in theo chiều ngang

Postby muaphonui_2010 » Thu 20/02/2014 4:08 pm

Chào các bạn!
Hôm trước mình chạy cấu SQL trên , mình không truyền tham số vào nên thấy nó chạy ok, nhưng hôm nay mình thêm truyền tham số vào nó báo lỗi
Nhờ các bạn xem giúp mình với.
Mình viết trong Procedure

Code: Select all

ALTER Procedure [dbo].[inphieu]
@txtid int
As
DECLARE @SQL AS NVARCHAR(500)
DECLARE @ColSize AS NVARCHAR(500)

SET @ColSize = (SELECT STUFF(
        (SELECT DISTINCT ', ' + quotename([SIZE], ']') FROM Q_inphieu_ngang FOR XML PATH('')), 1, 1, ''))
 
SET @SQL = ' SELECT * FROM
                        (SELECT id, makhach,tenkhach,diachi,dienthoai,congtienhang,conggiamgia,tienthue,tongcong, mahang,tenhang,dvt,mau,soluong,dongiaban,[size] FROM Q_inphieu_ngang WHERE id = @txtid)s1
                                PIVOT (
                                        SUM(soluong) FOR [size] IN (' + @ColSize + ')                         
                                )s2'
EXECUTE( @SQL)

Rồi text trong SQL nó báo như thế này

Code: Select all

USE [quanlynoibo_doc]
GO
DECLARE   @return_value int
EXEC   @return_value = [dbo].[inphieu]
      @txtid = NULL
SELECT   'Return Value' = @return_value
GO

Nó báo lỗi vậy mình ko biết sửa sao hết, nhờ các bạn chỉ giúp mình với,lần đầu dùng cái Procedure mình không biết.

Còn trong VB.Net mình viết như sau:

Code: Select all

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
         Try
            Dim adapter As New SqlDataAdapter()

            Dim cmd As New SqlCommand("inphieu", connect)
            cmd.CommandType = CommandType.StoredProcedure
            cmd.Parameters.AddWithValue("@txtid", Val(360))
            adapter.SelectCommand = cmd
            Dim dt As New DataTable()
            adapter.Fill(dt)

            connect.Open()
            cmd.ExecuteNonQuery()
            connect.Close()
            cmd.Dispose()
            GridControl1.DataSource = dt
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

Nhờ các bạn chỉ giúp mình với.

---------
Mình có thêm 1 vấn đề nữa là :
Khi mình có được cái DataTable dữ liệu trên "adapter.Fill(dt)"
Giờ mình chuyển sang "In Phiếu Giao Hàng"
Nhưng mình gặp vấn đề là Các cột "mã hàng, tên hàng, số lượng, đơn giá, thành tiền nó cố định , nhưng cột size nó động thì là sao in được các bạn nhỉ.
Mình nói lại cho các bạn hiểu ý mình.
Cấu trúc DataTable như sau: mahang, tenhang, soluong, don gia, thanhtien, size35, size36, size37, sizeA, sizeB.....==> cột size là động.
Vậy làm sao in được phiếu giao hàng khi chưa biết trước được số cột size các bạn nhỉ.
Mình nghĩ không ra được giải pháp co vấn đề này. Mong các bạn chỉ giúp mình với.

muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Posts: 541
Joined: Fri 26/11/2010 1:15 pm
Location: TP.HCM
Has thanked: 189 times
Been thanked: 33 times
Contact:

Re: Nhờ giúp nhập dữ liệu theo chiều doc in theo chiều ngang

Postby muaphonui_2010 » Mon 13/06/2016 9:02 pm

Chào bạn cuibaphp !
DECLARE @SQL AS NVARCHAR(500)
DECLARE @ColSize AS NVARCHAR(500)

SET @ColSize = (SELECT STUFF(
(SELECT DISTINCT ', ' + quotename([SIZE], ']') FROM Table_1 FOR XML PATH('')), 1, 1, ''))

SET @SQL = ' SELECT * FROM
(SELECT mahang,dvt,mau,soluong,[size] FROM Table_1)s1
PIVOT (
SUM(soluong) FOR [size] IN (' + @ColSize + ')
)s2'

EXECUTE( @SQL)

Giờ mình muốn sắp xếp theo cột SIZE thì phải làm sao vậy bạn.
Vì hiện tại nó đang sắp xếp theo mã hàng rồi mưới tới SIZE, nên Cột SIZE nó nhãy lung tung lắm, Có thế nó nhãy SiZE 40, 38, 39,
Mình Muốn Nó theo SIZE 38,39,40 thì phải thêm như thế nào vậy bạn.
Nhờ bạn nào biết giúp mình với nhé.
Xin chân thành cảm ơn!!


Return to “Ứng dụng Quản lý và Cơ sở dữ liệu”

Who is online

Users browsing this forum: No registered users and 1 guest