Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

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

Điều hành viên: Điều hành

Đăng trả lời
muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 553
Ngày tham gia: Thứ 6 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 190 times
Been thanked: 36 times
Tiếp xúc:

Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by muaphonui_2010 »

Chào các bạn
Mình gặp vấn đề này khó quá, nhờ các bạn giúp mình với nha.
Tình hình là mình làm cái bảng chi tiết công nợ, có các cột Dư nợ, Dư có cần tính lũy kế, mình nghĩ hoài mà không ra giải pháp nào.
- Nếu chỉ có 1 mã khách thì mình có thể tính ở trong code luôn thì được, nhưng yêu cầu là thể hiện nhiều khách (mục đích của việc này là thể hiện nhiều khách thì khi mình in sổ chi tiết công nợ nó tự in tất cả các khách theo dạng sub report luôn, như vậy khỏi in từng khách).
Mình có bảng dữ liệu và mình mong muốn kết quả như hình dưới.
Hình ảnh

Đó là dạng sổ chi tiết công nợ. Có lẽ vấn đề này chắc phải cao cao thủ mới làm được quá. mình thấy nó mơ hồ quá.
Mong các bạn giúp mình với.
File dữ liệu mình đính kèm để các bạn copy pass vào cho nhanh.
http://www.mediafire.com/view/84yek8205 ... HoiDap.xls
FlyingFox
Guru
Guru
Bài viết: 833
Ngày tham gia: Thứ 4 20/04/2011 9:56 am
Been thanked: 326 times

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by FlyingFox »

Trong những trường hợp query phức tạp cho các báo cáo thì nên viết stored procedure rồi temporary table và cursor đễ làm sẽ dễ dàng hơn.
Có thễ viết đại khái như sau:

[sql]declare procedure sp_baocao_congno
@makhach nvarchar(50) = null,
@thang int
as begin
declare @makh nvarchar(50), @ngaythang datetime, @taikhoan nvarchar(50),
@nodauky float, @phatsinhno float, @phatsinhco float, @nocuoiky float, @codauky float
select makhach, ngaythang, taikhoan,
0.0 as nodauky,
0.0 as phatsinhno,
0.0 as phatsinhco,
0.0 as nocuoiky,
0.0 as codauky
into #temp
from congno
where (@makhach is null or (@makhach is not null and makhach = @makhach))
and month(ngaythang) = @thang
order by makhach, ngaythang, taikhoan

declare congno_cur cursor for
select makhach, ngaythang, taikhoan
from #temp
open congno_cur
while 1 = 1 begin
fetch congno_cur into @makh, @ngaythang, @taikhoan
if @@fecth_status <> 0 break

-- tinh nodauky, phatsinhno, phatsinhco, nocuoiky, codauky theo makhach, ngaythang, taikhoan

update #temp
set nodauky = @nodauky,
phatsinhno = @phatsinhno,
phatsinhco = @phatsinhco,
nocuoiky = @nocuoiky,
codauky = @codauky
where makhach = @makhach and ngaythang = @ngaythang and taikhoan = @taikhoan
end
close congno_cur;
deallocate congno_cur;

select * from #temp
drop table #temp
end[/sql]
muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 553
Ngày tham gia: Thứ 6 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 190 times
Been thanked: 36 times
Tiếp xúc:

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by muaphonui_2010 »

Cảm ơn bạn nhiều nhé.
Mới mở lên thấy câu hỏi của mình thấy có người trả lời, mình ơi là mừng, nhưng đọc, ngâm hoài không được hjhj.
Nhưng với khã năng của mình thì đọc mấy dòng cursor của bạn mình bị choán he he.
Nói dỡn chứ mình đọc không hiểu mấy, nên mò cách thủ công. mình chế như sau:

Mã: Chọn tất cả

#Region "Load  tính lũy kế"
    Private Sub Load_dulieu()
        Try
            'Xóa bảng lưu tạm
            kn.thuchientruyvan("delete T_LuuTam_TinhLuyKeChiTietCongNo")
            'Xóa điều kiện sort và Filter trên lưới 
            chitiet.ActiveFilterString = String.Empty
            chitiet.ClearSorting()
            'Tính toán số liệu để lưu vào bảng lưu tạm chi tiết công nợ
            'Lưu số liệu phát sinh trong kỳ
            kn.thuchientruyvan("insert into T_LuuTam_TinhLuyKeChiTietCongNo( stt, id, idcon, ngaythang, makhach, taikhoan, daukyno, daukyco, phatsinhno, phatsinhco) SELECT stt, id, idcon, ngaythang, makhach, taikhoan, 0 AS daukyno, 0 AS daukyco, phatsinhno, phatsinhco FROM dbo.K_candoiphatsinh WHERE (ngaythang Between '" & Format((tungay.EditValue), "MM/dd/yyyy") & "' and '" & Format((denngay.EditValue), "MM/dd/yyyy") & "') And (makhach LIKE N'" & txtmakhach.EditValue & "%') And (taikhoan LIKE N'" & txttaikhoan.EditValue & "%') AND (madonvi = N'" & txtmadonvi & "') ORDER BY makhach, ngaythang, id, stt, idcon")

            'Lưu tiếp số liệu đầu kỳ, đặt biệt của chổ này là lưu theo các thông tin có sẳn và lấy dòng đầu tiên của dữ liệu phát sinh trong kỳ NHàm mục đích là để group nó lại thì nó sẽ nằm ngay trong dòng đầu của dòng phát sinh đầu tiên.
            kn.thuchientruyvan("insert into T_LuuTam_TinhLuyKeChiTietCongNo(makhach, taikhoan, daukyno, daukyco, id, idcon, ngaythang, stt) SELECT makhach, taikhoan, CASE WHEN SUM((ISNULL(phatsinhno,0)) - (ISNULL(phatsinhco,0)))>0 THEN SUM((ISNULL(phatsinhno,0)) - (ISNULL(phatsinhco,0))) ELSE 0 END AS daukyno, CASE WHEN SUM((ISNULL(phatsinhno,0)) - (ISNULL(phatsinhco,0)))>0 THEN 0 ELSE abs(SUM((ISNULL(phatsinhno,0)) - (ISNULL(phatsinhco,0)))) END AS daukyco, " & _
                          "(SELECT TOP (1) id FROM dbo.T_LuuTam_TinhLuyKeChiTietCongNo WHERE (makhach = dbo.K_candoiphatsinh.makhach) AND (taikhoan = dbo.K_candoiphatsinh.taikhoan) ORDER BY ngaythang, id, stt, idcon) AS id, " & _
                          "(SELECT TOP (1) idcon FROM dbo.T_LuuTam_TinhLuyKeChiTietCongNo AS T_LuuTam_TinhLuyKeChiTietCongNo_2 WHERE (makhach = dbo.K_candoiphatsinh.makhach) AND (taikhoan = dbo.K_candoiphatsinh.taikhoan) ORDER BY ngaythang, id, stt, idcon) AS idcon, " & _
                          "(SELECT TOP (1) ngaythang FROM dbo.T_LuuTam_TinhLuyKeChiTietCongNo AS T_LuuTam_TinhLuyKeChiTietCongNo_1 WHERE (makhach = dbo.K_candoiphatsinh.makhach) AND (taikhoan = dbo.K_candoiphatsinh.taikhoan) ORDER BY ngaythang, id, stt, idcon) AS ngaythang, " & _
                          "(SELECT TOP (1) stt FROM dbo.T_LuuTam_TinhLuyKeChiTietCongNo AS T_LuuTam_TinhLuyKeChiTietCongNo_3 WHERE (makhach = dbo.K_candoiphatsinh.makhach) AND (taikhoan = dbo.K_candoiphatsinh.taikhoan) ORDER BY ngaythang, id, stt, idcon) AS stt " & _
                          "FROM dbo.K_candoiphatsinh WHERE (ngaythang < '" & Format((tungay.EditValue), "MM/dd/yyyy") & "') AND (makhach LIKE N'" & txtmakhach.EditValue & "%') AND (taikhoan LIKE N'" & txttaikhoan.EditValue & "%') AND (madonvi = N'" & txtmadonvi & "') GROUP BY makhach, taikhoan")

' Như vậy tới đây ta đã có dữ liệu dạng như  hình dưới cùng
            'đổ toàn bộ dữ liệu vào lưới
            dtlietke = kn.laybangdulieu("SELECT dbo.K_chitietcongno_nhieukhach.id, dbo.K_chitietcongno_nhieukhach.idcon, dbo.K_chitietcongno_nhieukhach.ngaythang, " & _
            "dbo.K_chitietcongno_nhieukhach.makhach, dbo.K_chitietcongno_nhieukhach.taikhoan, dbo.K_chitietcongno_nhieukhach.daukyno, " & _
            "dbo.K_chitietcongno_nhieukhach.daukyco, dbo.K_chitietcongno_nhieukhach.phatsinhno, dbo.K_chitietcongno_nhieukhach.phatsinhco, " & _
            "dbo.K_chitietcongno_nhieukhach.cuoikyno, dbo.K_chitietcongno_nhieukhach.cuoikyco, dbo.K_candoiphatsinh.machungtu, dbo.K_candoiphatsinh.madonvi, " & _
            "dbo.K_candoiphatsinh.mangoaite, dbo.K_candoiphatsinh.tygiangoaite, dbo.K_candoiphatsinh.sochungtu, dbo.K_candoiphatsinh.tenkhach, " & _
            "dbo.K_candoiphatsinh.nguoigiaodich, dbo.K_candoiphatsinh.diengiai, dbo.K_candoiphatsinh.mahang, dbo.K_candoiphatsinh.tenhang, dbo.K_candoiphatsinh.dvt, " & _
            "dbo.K_candoiphatsinh.makho, dbo.K_candoiphatsinh.soluong, dbo.K_candoiphatsinh.dongia, dbo.K_candoiphatsinh.dongiant, dbo.K_candoiphatsinh.noidung, " & _
            "dbo.K_candoiphatsinh.taikhoandoiung, dbo.K_candoiphatsinh.nhomhang, dbo.K_candoiphatsinh.nhomkhach, dbo.K_candoiphatsinh.manguoiphutrach, " & _
            "dbo.K_candoiphatsinh.ngaychotno, dbo.K_candoiphatsinh.hanthanhtoan, dbo.K_candoiphatsinh.hanmucno, dbo.K_candoiphatsinh.dvtchinh,dbo.K_candoiphatsinh.soluongchinh " & _
"FROM dbo.K_chitietcongno_nhieukhach LEFT OUTER JOIN " & _
                      "dbo.K_candoiphatsinh ON dbo.K_chitietcongno_nhieukhach.taikhoan = dbo.K_candoiphatsinh.taikhoan AND " & _
            "dbo.K_chitietcongno_nhieukhach.id = dbo.K_candoiphatsinh.id And dbo.K_chitietcongno_nhieukhach.idcon = dbo.K_candoiphatsinh.idcon " & _
"ORDER BY dbo.K_chitietcongno_nhieukhach.makhach, dbo.K_chitietcongno_nhieukhach.ngaythang, dbo.K_chitietcongno_nhieukhach.id, dbo.K_chitietcongno_nhieukhach.stt, dbo.K_chitietcongno_nhieukhach.idcon")
' Đổ dữ liệu vào Gridcontrol
            hienthi.DataSource = dtlietke
            'lấy nhóm để lọc theo từng nhóm, có nghĩa là các mã khách và mã tài khoản để làm điều kiện lọc.
            Dim dtloctrenluoi_chitiet As DataTable = kn.laybangdulieu("SELECT makhach, taikhoan FROM dbo.T_LuuTam_TinhLuyKeChiTietCongNo GROUP BY makhach, taikhoan ORDER BY makhach, taikhoan")
            
            For i = 0 To dtloctrenluoi_chitiet.Rows.Count - 1 ' Bắt đầu đi từng dòng để lấy điều kiện lọc
                Dim chuoi As String = "[makhach] = '" & dtloctrenluoi_chitiet.Rows(i).Item("makhach") & "' AND [taikhoan] = '" & dtloctrenluoi_chitiet.Rows(i).Item("taikhoan") & "'"
                chitiet.ActiveFilterString = chuoi ' Lọc vào lưới Gridview, lọc xong rồi mình tính lũy kế băng hàm dưới
                Load_tinhluyke()
            Next
            chitiet.ActiveFilterString = String.Empty Bỏ điều kiện lọc

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

#End Region
    'Tính lũy kế
    Private Sub Load_tinhluyke()
        Try
            If chitiet.RowCount > 0 Then
                For i As Integer = 0 To chitiet.RowCount
                    If i = 0 Then ' trường hợp cho dòng thứ 0
                        ' Nếu mà dư cuối >0 thì điền vào cột nợ cuối, và ngược lại
                        If (Val(chitiet.GetRowCellValue(i, chitiet.Columns("daukyno"))) - Val(chitiet.GetRowCellValue(i, chitiet.Columns("daukyco"))) + Val(chitiet.GetRowCellValue(i, chitiet.Columns("phatsinhno"))) - Val(chitiet.GetRowCellValue(i, chitiet.Columns("phatsinhco")))) > 0 Then
                            chitiet.SetRowCellValue(i, chitiet.Columns("cuoikyno"), (Val(chitiet.GetRowCellValue(i, chitiet.Columns("daukyno"))) - Val(chitiet.GetRowCellValue(i, chitiet.Columns("daukyco"))) + Val(chitiet.GetRowCellValue(i, chitiet.Columns("phatsinhno"))) - Val(chitiet.GetRowCellValue(i, chitiet.Columns("phatsinhco")))))
                        Else
                            chitiet.SetRowCellValue(i, chitiet.Columns("cuoikyco"), Math.Abs(Val(chitiet.GetRowCellValue(i, chitiet.Columns("daukyno"))) - Val(chitiet.GetRowCellValue(i, chitiet.Columns("daukyco"))) + Val(chitiet.GetRowCellValue(i, chitiet.Columns("phatsinhno"))) - Val(chitiet.GetRowCellValue(i, chitiet.Columns("phatsinhco")))))
                        End If
                       
                    Else ' các dòng thứ 1 đến n
                        ' ĐIền vào cột dư đầu kỳ của các cột >
                        chitiet.SetRowCellValue(i, chitiet.Columns("daukyno"), Val(chitiet.GetRowCellValue(i - 1, chitiet.Columns("cuoikyno"))))
                        chitiet.SetRowCellValue(i, chitiet.Columns("daukyco"), Val(chitiet.GetRowCellValue(i - 1, chitiet.Columns("cuoikyco"))))
                       
                        ' Tính lại dư nợ cuối, nếu > 0 ghi vào bên nợ và ngược lại
                        If (Val(chitiet.GetRowCellValue(i, chitiet.Columns("daukyno"))) - Val(chitiet.GetRowCellValue(i, chitiet.Columns("daukyco"))) + Val(chitiet.GetRowCellValue(i, chitiet.Columns("phatsinhno"))) - Val(chitiet.GetRowCellValue(i, chitiet.Columns("phatsinhco")))) > 0 Then
                            chitiet.SetRowCellValue(i, chitiet.Columns("cuoikyno"), (Val(chitiet.GetRowCellValue(i, chitiet.Columns("daukyno"))) - Val(chitiet.GetRowCellValue(i, chitiet.Columns("daukyco"))) + Val(chitiet.GetRowCellValue(i, chitiet.Columns("phatsinhno"))) - Val(chitiet.GetRowCellValue(i, chitiet.Columns("phatsinhco")))))
                        Else
                            chitiet.SetRowCellValue(i, chitiet.Columns("cuoikyco"), Math.Abs(Val(chitiet.GetRowCellValue(i, chitiet.Columns("daukyno"))) - Val(chitiet.GetRowCellValue(i, chitiet.Columns("daukyco"))) + Val(chitiet.GetRowCellValue(i, chitiet.Columns("phatsinhno"))) - Val(chitiet.GetRowCellValue(i, chitiet.Columns("phatsinhco")))))
                        End If
                       
                    End If
                Next
            End If
            hienthi.Refresh()
        Catch ex As Exception

        End Try
    End Sub
Hình ảnh
Mình làm như trên chạy thì chưa phát hiện đều gì , nhưng làm như vậy thủ công quá, không biết các bạn có cách nào hay khác không nữa, Vì nếu mình rành về cursor chứ không là khi mình có cái bảng dữ liệu như hình dưới thì có lẽ dùng cursor thì dễ dàng hơn nhiều.
Chân thành cảm ơn bạn.
Chúc bạn vui vẽ nhé.
FlyingFox
Guru
Guru
Bài viết: 833
Ngày tham gia: Thứ 4 20/04/2011 9:56 am
Been thanked: 326 times

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by FlyingFox »

Thay vì viết những query như trên trong VB.NET thì viết stored procedure rồi trong VB.NET chĩ cần gọi stored procedure đó đễ load vào datatable thôi.

[sql]drop procedure sp_baocao_congno
go

create procedure sp_baocao_congno
@makhach nvarchar(50) = null,
@start_date datetime,
@end_date datetime
as begin
declare @id int, @makh nvarchar(50), @ngaythang datetime, @taikhoan nvarchar(50),
@old_makh nvarchar(50), @old_ngaythang datetime, @old_taikhoan nvarchar(50),
@nodauky float, @phatsinhno float, @phatsinhco float, @nocuoiky float, @codauky float,
@daukyno float, @daukyco float, @tienno float, @tienco float, @co float, @no float,
@tien_nodauky float, @tien_phatsinhno float, @tien_phatsinhco float, @tien_nocuoiky float, @tien_codauky float

select @old_makh = '', @old_taikhoan = '', @old_ngaythang = null

SELECT T1.id,
T1.idcon,
T1.ngaythang,
T1.makhach,
T1.taikhoan,
T1.daukyno,
T1.daukyco,
T1.phatsinhno,
T1.phatsinhco,
T1.cuoikyno,
T1.cuoikyco,
T2.machungtu,
T2.madonvi,
T2.mangoaite,
T2.tygiangoaite,
T2.sochungtu,
T2.tenkhach,
T2.nguoigiaodich,
T2.diengiai,
T2.mahang,
T2.tenhang,
T2.dvt,
T2.makho,
T2.soluong,
T2.dongia,
T2.dongiant,
T2.noidung,
T2.taikhoandoiung,
T2.nhomhang,
T2.nhomkhach,
T2.manguoiphutrach,
T2.ngaychotno,
T2.hanthanhtoan,
T2.hanmucno,
T2.dvtchinh,
T2.soluongchinh
INTO #temp
FROM dbo.K_chitietcongno_nhieukhach T1
LEFT OUTER JOIN dbo.K_candoiphatsinh T2 ON
T1.taikhoan = T2.taikhoan AND T1.id = T2.id AND T1.idcon = T2.idcon
WHERE T1.makhach like isnull(@makhach,'') + '%'
AND T1.ngaythang between @start_date and @end_date
ORDER BY T1.makhach, T1.ngaythang, T1.id, T1.stt, T1.idconend

DECLARE congno_cur CURSOR FOR
SELECT id, makhach, taikhoan, ngaythang, daukyno, daukyco, phatsinhno, phatsinhco
FROM #temp
ORDER BY makhach, taikhoan, ngaythang, id
OPEN congno_cur
while 1 = 1 begin
fetch congno_cur into @id, @makh, @taikhoan, @ngaythang, @daukyno, @daukyco, @phatsinhno, @phatsinhco
if @@FETCH_STATUS <> 0 break

-- tính tiền nợ và có cho hàng đầu tiên dựa theo khách hàng và tài khoản
if @makh <> isnull(@old_makh,'') or @taikhoan <> isnull(@old_taikhoan,'') begin
SELECT @no = SUM(ISNULL(phatsinhno,0)),
@co = SUM(ISNULL(phatsinhco,0))
FROM dbo.K_candoiphatsinh
WHERE makhach = @makh AND taikhoan = @taikhoan AND ngaythang < @ngaythang
if isnull(@no,0) > isnull(@co,0) begin
select @tienno = isnull(@no,0) - isnull(@co,0), @tienco = 0
end else begin
select @tienco = isnull(@co,0) - isnull(@no,0), @tienno = 0
end
select @old_makh = @makh, @old_taikhoan = @taikhoan
end

-- bây giờ tính công nợ cho mỗi hàng (theo id)
-- phãi sữa lại @tien_nodauky, @tien_phatsinhno, @tien_nocuoiky, @tien_codauky tương tự như hàm Load_tinhluyke
set @tien_nodauky = @tienno
set @tien_phatsinhno = @tienco
set @tien_nocuoiky = 0
set @tien_codauky = 0

update #temp
set nodauky = @tien_nodauky,
phatsinhno = @tien_phatsinhno,
phatsinhco = @tien_phatsinhco,
nocuoiky = @tien_nocuoiky,
codauky = @tien_codauky
where id = @id
end
CLOSE congno_cur;
DEALLOCATE congno_cur;

SELECT * FROM #temp
ORDER BY makhach, taikhoan, ngaythang, id

DROP table #temp
end
[/sql]

Test stored procedure đó trong SQL Management Studio như sau:
[sql]exec sp_baocao_congno
@makhach = 'KH01',
@start_date = '2015/02/01',
@end_date = '2015/02/28'[/sql]
muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 553
Ngày tham gia: Thứ 6 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 190 times
Been thanked: 36 times
Tiếp xúc:

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by muaphonui_2010 »

Bạn ơi mình có cái ý tưởng điên khùng này bạn xem thử có thực hiện dc không với bạn.
Vì cái của bạn làm ở trên khác 1 ít so với dữ liệu của mình hiện có nên mình mô phỏng lại cái ý tưởng và tuần tự làm, bạn xem giúp mình với.
Lưu ý mình đã có dữ liệu dạng chế biến sẳn nhưng còn thô ỏ cột lũy kế thôi nhé bạn , dữ liệu đó mình tính ra ở Query K_chitietcongno_nhieukhach như hình dưới
Hình ảnh

Bạn giúp mình sửa lại code theo mô hình mình mô tả dở dưới với nhé, xin lỗi đã làm phiền bạn quá nhiều.
[sql]
DROP PROCEDURE sp_baocao_congno
GO

CREATE PROCEDURE sp_baocao_congno
@makhach nvarchar(50) = NULL,
@start_date datetime,
@end_date datetime
AS BEGIN
DECLARE @id INT, @idcon INT, @stt INT, @makh nvarchar(50), @ngaythang datetime, @taikhoan nvarchar(50),
@old_makh nvarchar(50), @old_ngaythang datetime, @old_taikhoan nvarchar(50),
@nodauky FLOAT, @phatsinhno FLOAT, @phatsinhco FLOAT, @nocuoiky FLOAT, @codauky FLOAT,
@daukyno FLOAT, @daukyco FLOAT, @tienno FLOAT, @tienco FLOAT, @co FLOAT, @no FLOAT,
@tien_nodauky FLOAT, @tien_phatsinhno FLOAT, @tien_phatsinhco FLOAT, @tien_nocuoiky FLOAT, @tien_codauky FLOAT, @tien_nocuoiky_old FLOAT, @tien_codauky_old FLOAT

SELECT @old_makh = '', @old_taikhoan = '', @old_ngaythang = NULL

SELECT T1.id,
T1.idcon,
T1.ngaythang,
T1.makhach,
T1.taikhoan,
T1.daukyno,
T1.daukyco,
T1.phatsinhno,
T1.phatsinhco,
T1.cuoikyno,
T1.cuoikyco,
T2.machungtu,
T2.madonvi,
T2.mangoaite,
T2.tygiangoaite,
T2.sochungtu,
T2.tenkhach,
T2.nguoigiaodich,
T2.diengiai,
T2.mahang,
T2.tenhang,
T2.dvt,
T2.makho,
T2.soluong,
T2.dongia,
T2.dongiant,
T2.noidung,
T2.taikhoandoiung,
T2.nhomhang,
T2.nhomkhach,
T2.manguoiphutrach,
T2.ngaychotno,
T2.hanthanhtoan,
T2.hanmucno,
T2.dvtchinh,
T2.soluongchinh
INTO #temp
FROM dbo.K_chitietcongno_nhieukhach T1
LEFT OUTER JOIN dbo.K_candoiphatsinh T2 ON
T1.taikhoan = T2.taikhoan AND T1.id = T2.id AND T1.idcon = T2.idcon
ORDER BY T1.makhach, T1.ngaythang, T1.id, T1.stt, T1.idcon end

-- Lấy mã khách và tài khoản để làm điều kiện lọc cho CURSOR đi qua 1 mã khách và tài khoản thôi
SELECT makhach,taikhoan INTO #Grouptemp FROM #temp GROUP BY makhach,taikhoan ORDER BY makhach, taikhoan end
-- Như vậy tới đây ta đã có danh sách Tài khoản mà mã tài khoản cần đi qua

-----------------------
For 0 to #Grouptemp.row.cound -- ĐI qua từng dòng của #Grouptemp
--------------------

-- Trả các biến về lại 0 để làm lại trước khi làm nhóm khách mới
@tien_nocuoiky_old =0 , @tien_codauky_old =0 --..........Mình ko biết có cần thiết phải trả về = 0 ko nữa
----Dùng con trỏ ở đây
DECLARE congno_cur CURSOR FOR
SELECT id, idcon, stt, makhach, taikhoan, ngaythang, daukyno, daukyco, phatsinhno, phatsinhco
FROM #temp
WHERE (makhach like '#Grouptemp.Rows(i).Item("makhach")') AND (taikhoan like '#Grouptemp.Rows(i).Item("taikhoan")')
ORDER BY makhach, taikhoan, ngaythang, id, stt, idcon
OPEN congno_cur
while 1 = 1 BEGIN
fetch congno_cur INTO @id, @idcon, @stt, @makh, @taikhoan, @ngaythang, @daukyno, @daukyco, @phatsinhno, @phatsinhco
IF @@FETCH_STATUS <> 0 break

---------------------
--Nếu con trỏ đi qua dòng đầu tiên thì (Mình ko biết viết sao hết, bạn giúp mình với)
------------------------
IF (@daukyno- @daukyco + @phatsinhno - @phatsinhco)>0 BEGIN
SELECT @tien_nocuoiky = (@daukyno- @daukyco + @phatsinhno - @phatsinhco), @tien_cocuoiky = 0

END ELSE BEGIN
SELECT @tien_nocuoiky = 0, @tien_cocuoiky = abs(@daukyno- @daukyco + @phatsinhno - @phatsinhco)
END
-- Lưu lại biến @tien_nocuoiky_old, @tien_codauky_old để qua dòng thứ 2 nhập vô cột đầu kỳ
@tien_nocuoiky_old = @tien_nocuoiky
@tien_cocuoiky_old = @tien_cocuoiky


-- Thực hiện update cho dòng đâu tiên , ghi vào cột cuối kỳ
UPDATE #temp
SET nocuoiky = @tien_nocuoiky,
cocuoiky = @tien_codauky
WHERE id = @id, idcon = @idcon, stt = @stt,makhach = @makh, taikhoan = @taikhoan

-----------------
--ELSE --Trường hợp cho không khải dòng đầu tiên thì lấy số dư nợ, có cuối kỳ dòng kề trên nhập vào cột đầu kỳ của dòng hiện tại
-----------------

IF (@tien_nocuoiky_old - @tien_cocuoiky_old + @phatsinhno - @phatsinhco)>0 BEGIN
SELECT @tien_nocuoiky = (@tien_nocuoiky_old- @tien_cocuoiky_old + @phatsinhno - @phatsinhco), @tien_cocuoiky = 0

END ELSE BEGIN
SELECT @tien_nocuoiky = 0, @tien_cocuoiky = abs(@tien_nocuoiky_old- @tien_cocuoiky_old + @phatsinhno - @phatsinhco)
END
-- Lưu lại biến @tien_nocuoiky_old, @tien_codauky_old để qua dòng thứ i+1 nhập vô cột đầu kỳ
@tien_nocuoiky_old = @tien_nocuoiky
@tien_cocuoiky_old = @tien_cocuoiky


UPDATE #temp
SET daukyno = @tien_nocuoiky_old, ---các số này lấy khi ta lưu lại số dư cuối kỳ của dòng kế trên 1 dòng so với dòng hiện tại
daukyco = @tien_cocuoiky_old
--Ghi vào cột cuối kỳ
cuoikyno = @tien_nocuoiky
cuoikyco = @tien_cocuoiky
WHERE id = @id, idcon = @idcon, stt = @stt,makhach = @makh, taikhoan = @taikhoan
------------------------
--End -- Kết thúc vòng if nếu dòng đầu tiên
--------------------------

CLOSE congno_cur; --- Kết thúc con trỏ và giải phóng ngay khi kết thúc đi qua 1 nhóm được ko vậy bạn
DEALLOCATE congno_cur;
-------------------
Net
-------------------
-----------------------------------------------
SELECT * FROM #temp
ORDER BY makhach, taikhoan, ngaythang, id

DROP TABLE #temp
END
[/sql]
FlyingFox
Guru
Guru
Bài viết: 833
Ngày tham gia: Thứ 4 20/04/2011 9:56 am
Been thanked: 326 times

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by FlyingFox »

Upload your database backup.
muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 553
Ngày tham gia: Thứ 6 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 190 times
Been thanked: 36 times
Tiếp xúc:

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by muaphonui_2010 »

Để mình giải thích thêm cho bạn về cái databasse của mình
Bạn chỉ quan tâm đến bảng Table T_LuuTam_TinhLuyKeChiTietCongNo ==> Là số liệu mình lưu vào những số liệu cần tính công nợ = câu insert ở vb rồi.
Như vậy mình có dữ liệu ở T_LuuTam_TinhLuyKeChiTietCongNo sau đó mình dùng query K_chitietcongno_nhieukhach ==> là query group dữ liệu lại từ Table T_LuuTam_TinhLuyKeChiTietCongNo====> Mình nghĩ bạn chỉ cần quan tâm đến query K_chitietcongno_nhieukhach này và đi điền lũy kế vào cho mình với là đủ rồi. chứ cả đống Tables trong đó mình sợ bạn ko biết đâu mà lần quá .
đây là databasse của mình, tất cả dữ liệu mình gôm vào query K_candoiphatsinh, tất cả các báo cáo đều lấy từ đây ra nha bạn. Nhưng mình nghĩ bạn giúp mình từ bước K_chitietcongno_nhieukhach là được rồi bạn.

Hoặc bạn sửa giúp mình lỗi cấu trúc của cái này , mình nghĩ chắc chạy được.
[sql]DROP PROCEDURE sp_baocao_congno
GO

CREATE PROCEDURE sp_baocao_congno
AS BEGIN
DECLARE @id INT,@idcon INT, @stt INT, @makhach nvarchar(50), @ngaythang datetime, @taikhoan nvarchar(50),
@daukyno FLOAT,@daukyco FLOAT, @phatsinhno FLOAT, @phatsinhco FLOAT, @cuoikyno FLOAT, @cuoikyco FLOAT,
@old_makhach nvarchar(50), @old_taikhoan nvarchar(50), @old_cuoikyno FLOAT, @old_cuoikyco FLOAT

SELECT @old_makhach = '', @old_taikhoan = ''--, @old_ngaythang = NULL

SELECT T1.id,
T1.stt,
T1.idcon,
T1.ngaythang,
T1.makhach,
T1.taikhoan,
T1.daukyno,
T1.daukyco,
T1.phatsinhno,
T1.phatsinhco,
T1.cuoikyno,
T1.cuoikyco,
T2.machungtu,
T2.madonvi,
T2.mangoaite,
T2.tygiangoaite,
T2.sochungtu,
T2.tenkhach,
T2.nguoigiaodich,
T2.diengiai,
T2.mahang,
T2.tenhang,
T2.dvt,
T2.makho,
T2.soluong,
T2.dongia,
T2.dongiant,
T2.noidung,
T2.taikhoandoiung,
T2.nhomhang,
T2.nhomkhach,
T2.manguoiphutrach,
T2.ngaychotno,
T2.hanthanhtoan,
T2.hanmucno,
T2.dvtchinh,
T2.soluongchinh
INTO #temp
FROM dbo.K_chitietcongno_nhieukhach T1
LEFT OUTER JOIN dbo.K_candoiphatsinh T2 ON
T1.taikhoan = T2.taikhoan AND T1.id = T2.id AND T1.idcon = T2.idcon
ORDER BY T1.makhach, T1.ngaythang, T1.id, T1.stt, T1.idcon end

DECLARE congno_cur CURSOR FOR
SELECT id, idcon, stt, makhach, taikhoan, ngaythang, daukyno, daukyco, phatsinhno, phatsinhco
FROM #temp
ORDER BY makhach, taikhoan, ngaythang, id, stt, idcon
OPEN congno_cur
while 1 = 1 BEGIN
fetch congno_cur INTO @id, @idcon, @stt, @makhach, @taikhoan, @ngaythang, @daukyno, @daukyco, @phatsinhno, @phatsinhco
IF @@FETCH_STATUS <> 0 break

-- tính tiền nợ và có cho hàng đầu tiên dựa theo khách hàng và tài khoản
IF @makhach <> isnull(@old_makhach,'') OR @taikhoan <> isnull(@old_taikhoan,'') BEGIN

IF (isnull(@daukyno,0)- isnull(@daukyco,0)+ isnull(@phatsinhno,0)- isnull(@phatsinhco,0)) > 0 BEGIN
SELECT @cuoikyno = (isnull(@daukyno,0)- isnull(@daukyco,0)+ isnull(@phatsinhno,0)- isnull(@phatsinhco,0)), @cuoikyco = 0
END ELSE BEGIN
SELECT @cuoikyno = 0, @cuoikyco = ABS(isnull(@daukyno,0)- isnull(@daukyco,0)+ isnull(@phatsinhno,0)- isnull(@phatsinhco,0))
END
--Lưu lại thông tin của dòng đầu tiên
SELECT @old_makhach = @makhach, @old_taikhoan = @taikhoan , @old_cuoikyno = @cuoikyno, @old_cuoikyco = @cuoikyco
--Thực hiện update cho dòng đầu tiên của nhóm
UPDATE #temp
SET cuoikyno = @cuoikyno,
cuoikyco = @cuoikyco
WHERE id = @id, idcon = @idcon, stt = @stt, makhach = @makhach, taikhoan = @taikhoan

END ELSE BEGIN -- Trường hợp cho từ dòng thứ 2 trở đi (lấy nợ cuối kỳ củ + với phát sinh = nợ cuối kỳ mới

IF (isnull(@old_cuoikyno,0)- isnull(@old_cuoikyco,0)+ isnull(@phatsinhno,0)- isnull(@phatsinhco,0)) > 0 BEGIN
SELECT @cuoikyno = (isnull(@old_cuoikyno,0)- isnull(@old_cuoikyco,0)+ isnull(@phatsinhno,0)- isnull(@phatsinhco,0)), @cuoikyco = 0
END ELSE BEGIN
SELECT @cuoikyno = 0, @cuoikyco = ABS(isnull(@old_cuoikyno,0)- isnull(@old_cuoikyco,0) + isnull(@phatsinhno,0)- isnull(@phatsinhco,0))
END
--Lưu lại thông tin của dòng này để qua dòng tiếp theo có mà đối chiếu
SELECT @old_makhach = @makhach, @old_taikhoan = @taikhoan , @old_cuoikyno = @cuoikyno, @old_cuoikyco = @cuoikyco

UPDATE #temp
SET daukyno = @old_cuoikyno,
daukyco = @old_cuoikyco,
cuoikyno = @cuoikyno,
cuoikyco = @cuoikyco
WHERE id = @id, idcon = @idcon, stt = @stt, makhach = @makhach, taikhoan = @taikhoan


END

END
CLOSE congno_cur;
DEALLOCATE congno_cur;

SELECT * FROM #temp
ORDER BY makhach, taikhoan, ngaythang, id, stt, idcon

DROP TABLE #temp
END[/sql]
Tập tin đính kèm
CongNoLuyKe.rar
(496.01 KiB) Đã tải về 256 lần
Sửa lần cuối bởi 1 vào ngày muaphonui_2010 với 0 lần sửa trong tổng số.
FlyingFox
Guru
Guru
Bài viết: 833
Ngày tham gia: Thứ 4 20/04/2011 9:56 am
Been thanked: 326 times

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by FlyingFox »

Viết lại như sau:
[sql]DROP PROCEDURE sp_baocao_congno
GO

CREATE PROCEDURE sp_baocao_congno
@makhach nvarchar(50) = NULL,
@mataikhoan nvarchar(50) = NULL,
@start_date datetime,
@end_date datetime
AS BEGIN
DECLARE @makh nvarchar(50), @ngaythang datetime, @taikhoan nvarchar(50),
@old_makh nvarchar(50), @old_taikhoan nvarchar(50),
@nodauky FLOAT, @phatsinhno FLOAT, @phatsinhco FLOAT,
@daukyno FLOAT, @daukyco FLOAT, @co FLOAT, @no FLOAT,
@cuoikyno FLOAT, @cuoikyco FLOAT

SELECT @old_makh = '', @old_taikhoan = ''

SELECT makhach,
taikhoan,
ngaythang,
CONVERT(float, 0) as daukyno,
CONVERT(float, 0) as daukyco,
sum(isnull(phatsinhno,0)) as phatsinhno,
sum(isnull(phatsinhco,0)) as phatsinhco,
CONVERT(float, 0) as cuoikyno,
CONVERT(float, 0) as cuoikyco
INTO #temp
FROM K_candoiphatsinh
WHERE makhach LIKE isnull(@makhach,'') + '%'
AND taikhoan LIKE isnull(@mataikhoan,'') + '%'
AND ngaythang BETWEEN @start_date AND @end_date
GROUP BY makhach, taikhoan, ngaythang
ORDER BY makhach, taikhoan, ngaythang

DECLARE congno_cur CURSOR FOR
SELECT makhach, taikhoan, ngaythang, phatsinhno, phatsinhco
FROM #temp
ORDER BY makhach, taikhoan, ngaythang
OPEN congno_cur
while 1 = 1 BEGIN
fetch congno_cur INTO @makh, @taikhoan, @ngaythang, @phatsinhno, @phatsinhco
IF @@FETCH_STATUS <> 0 break

-- tính tiền nợ và có cho hàng đầu tiên dựa theo khách hàng và tài khoản
IF @makh <> isnull(@old_makh,'') OR @taikhoan <> isnull(@old_taikhoan,'') BEGIN
SELECT @no = SUM(ISNULL(phatsinhno,0)),
@co = SUM(ISNULL(phatsinhco,0))
FROM dbo.K_candoiphatsinh
WHERE makhach = @makh AND taikhoan = @taikhoan AND ngaythang < @ngaythang
IF isnull(@no,0) > isnull(@co,0) BEGIN
SELECT @daukyno = isnull(@no,0) - isnull(@co,0), @daukyco = 0
END ELSE BEGIN
SELECT @daukyco = isnull(@co,0) - isnull(@no,0), @daukyno = 0
END
END

IF (@daukyno + @phatsinhno) > (@daukyco + @phatsinhco) BEGIN
SELECT @cuoikyno = (@daukyno + @phatsinhno) - (@daukyco + @phatsinhco), @cuoikyco = 0
END ELSE BEGIN
SELECT @cuoikyco = (@daukyco + @phatsinhco) - (@daukyno + @phatsinhno), @cuoikyno = 0
END

UPDATE #temp
SET daukyno = @daukyno,
daukyco = @daukyco,
phatsinhno = @phatsinhno,
phatsinhco = @phatsinhco,
cuoikyno = @cuoikyno,
cuoikyco = @cuoikyco
WHERE makhach = @makh AND taikhoan = @taikhoan AND ngaythang = @ngaythang

SELECT @old_makh = @makh, @old_taikhoan = @taikhoan,
@daukyno = @cuoikyno, @daukyco = @cuoikyco
END
CLOSE congno_cur;
DEALLOCATE congno_cur;

SELECT * FROM #temp
ORDER BY makhach, taikhoan, ngaythang

DROP TABLE #temp
END[/sql]

Run stored procedure
[sql]exec sp_baocao_congno
@makhach = 'NCC',
@mataikhoan = NULL,
@start_date = '2014/01/01',
@end_date = '2015/03/01'[/sql]
muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 553
Ngày tham gia: Thứ 6 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 190 times
Been thanked: 36 times
Tiếp xúc:

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by muaphonui_2010 »

Cảm ơn bạn.
Bạn quả thật là tuyệt vời, bạn quá vé ri gút.
PROCEDURE chạy thật ngon lành.
Mình lợm thêm cái này nữa là mình có dữ liệu như ý muốn rồi

Mã: Chọn tất cả

 Private Sub Goi_StoredProcedure()
        Dim mCmd As New SqlCommand
        Dim dt As New DataTable
        With mCmd
            .Connection = connect
            .CommandType = CommandType.StoredProcedure
            .CommandText = "sp_baocao_congno_chitiet"
            .Parameters.Add("@makhach", SqlDbType.NVarChar)
            .Parameters.Add("@mataikhoan", SqlDbType.NVarChar)
            .Parameters.Add("@start_date", SqlDbType.Date)
            .Parameters.Add("@end_date", SqlDbType.Date)

            .Parameters("@makhach").Value = txtmakhach.EditValue
            .Parameters("@mataikhoan").Value = txttaikhoan.EditValue
            .Parameters("@start_date").Value = tungay.EditValue
            .Parameters("@end_date").Value = denngay.EditValue

            Dim myDataAdapter As SqlDataAdapter = New SqlDataAdapter(mCmd)
            myDataAdapter.Fill(dt)
        End With
        connect.Close()
        hienthi.DataSource = dt
    End Sub
Xin cảm ơn bạn lần nữa.
muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 553
Ngày tham gia: Thứ 6 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 190 times
Been thanked: 36 times
Tiếp xúc:

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by muaphonui_2010 »

Hi bạn.
procedure trên bị 1 chổ bạn ơi. Hôm tối mình Run thấy chạy ngon lành, nhưng đến khi đi ngũ, nằm ngẩm nghĩ code bạn cho thì mình phát hiện 1 lỗ hỏng, sáng dậy text thử thì đúng là có 1 chổ
Khi từ ngày 01/01/2016 ---> 31/01/2016 thì sẽ không trả kết quả nào hết. Nếu đúng thì phải trả về số dư đầu kỳ và cuối kỳ (trong kỳ không phát sinh thì =0).
Trường hợp này sẽ gặp cho những khách hàng có mua ở kỳ trước ---> kỳ này không mua ---> phải có số dư đầu kỳ.
Với code của bạn thì chỉ lấy các dòng phát sinh trong kỳ và gắn lũy kế vào, như vậy không có phát sinh trong kỳ ==> không có dòng nào để gắn.
Có cách nào để khắc phụ nó không vậy bạn nhỉ.
Mình nghĩ chưa ra, vì nếu lưu thêm số đầu kỳ vào nữa thì sẽ gặp phải có những khách có phát sinh trong kỳ thì nó lại dư 1 dòng đầu kỳ...
muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 553
Ngày tham gia: Thứ 6 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 190 times
Been thanked: 36 times
Tiếp xúc:

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by muaphonui_2010 »

Bạn ơi mình đã insert thêm các mã khách và tải khoản của các mã khách và tài khoản không có phát sinh nhưng CÓ CÔNG NỢ ĐẦU KỲ vào #temp rồi mà nó vẫn chưa chạy dc bạn ơi.
Giúp mình nữa với bạn.
[sql]ALTER PROCEDURE [dbo].[sp_baocao_congno_chitiet]
@makhach nvarchar(50) = NULL,
@mataikhoan nvarchar(50) = NULL,
--@madonvi nvarchar(20) = NULL,
@start_date datetime,
@end_date datetime
AS BEGIN
DECLARE @id INT, @idcon INT, @stt INT, @makh nvarchar(50), @ngaythang datetime, @taikhoan nvarchar(50),
@old_makh nvarchar(50), @old_taikhoan nvarchar(50),
@nodauky FLOAT, @phatsinhno FLOAT, @phatsinhco FLOAT,
@daukyno FLOAT, @daukyco FLOAT, @co FLOAT, @no FLOAT,
@cuoikyno FLOAT, @cuoikyco FLOAT

SELECT @old_makh = '', @old_taikhoan = ''

SELECT makhach,
taikhoan,
ngaythang,
CONVERT(FLOAT, 0) AS daukyno,
CONVERT(FLOAT, 0) AS daukyco,
phatsinhno,
phatsinhco,
CONVERT(FLOAT, 0) AS cuoikyno,
CONVERT(FLOAT, 0) AS cuoikyco,
id, machungtu, madonvi, mangoaite, tygiangoaite, sochungtu, tenkhach, nguoigiaodich, diengiai, idcon, mahang, tenhang, dvt, makho, soluong, dongia, dongiant,
noidung, taikhoandoiung, loai, nhomhang, nhomkhach, manguoiphutrach, ngaychotno, hanthanhtoan, hanmucno, dvtchinh, soluongchinh, stt, mavatenkhach, (SELECT Top (1) (taikhoan + ' - ' + tentaikhoan) AS mavatentaikhoan FROM T_danhmuctaikhoan WHERE taikhoan = K_candoiphatsinh.taikhoan ) AS mavatentaikhoan
INTO #temp
FROM K_candoiphatsinh
WHERE makhach LIKE isnull(@makhach,'') + '%'
AND taikhoan LIKE isnull(@mataikhoan,'') + '%'
AND ngaythang BETWEEN @start_date AND @end_date
ORDER BY makhach, taikhoan, ngaythang, id, stt, idcon
--------MÌNH THÊM DÒNG NÀY ĐỂ INSERT THÊM CÁC MÃ KHÁCH VÀ MÃ TÀI KHOẢN CÓ SỐ DƯ ĐẦU KỲ NHƯNG KHÔNG PHÁT SINH TRONG KỲ
insert into #temp(id, idcon, stt , makhach, taikhoan, mavatenkhach, mavatentaikhoan, daukyno, daukyco, phatsinhno, phatsinhco, cuoikyno, cuoikyco)
SELECT 0, 0, 0, makhach, taikhoan, mavatenkhach, (SELECT Top (1) (taikhoan + ' - ' + tentaikhoan) AS mavatentaikhoan FROM T_danhmuctaikhoan WHERE taikhoan = K_candoiphatsinh.taikhoan ) AS mavatentaikhoan,0,0,0,0,0,0
FROM dbo.K_candoiphatsinh
WHERE (ngaythang < @start_date) And (makhach LIKE isnull(@makhach,'') + '%') And (taikhoan LIKE isnull(@mataikhoan,'') + '%') AND (makhach NOT IN (SELECT makhach FROM K_candoiphatsinh WHERE (ngaythang Between @start_date and @end_date) GROUP BY makhach))
GROUP BY makhach, taikhoan, mavatenkhach HAVING (SUM((ISNULL(phatsinhno,0)) - (ISNULL(phatsinhco,0)))<>0)
-------- TỚI ĐÂY THÌ MÌNH THẤY DỮ LIỆU ĐÃ CÓ THÊM CÁC NHỮNG DÒNG CÓ MÃ KHÁCH VÀ MÃ TÀI KHOẢN KHÔNG PHÁT SINH TRONG KỲ, NHƯNG CÓ SỐ DƯ ĐẦU KỲ, MÀ SAO NÓ Vẫn KO TÍNH DC BẠN NHỈ

DECLARE congno_cur CURSOR FOR
SELECT id, idcon, stt, makhach, taikhoan, ngaythang, phatsinhno, phatsinhco
FROM #temp
ORDER BY makhach, taikhoan, ngaythang, id, stt, idcon
OPEN congno_cur
while 1 = 1 BEGIN
fetch congno_cur INTO @id, @idcon, @stt, @makh, @taikhoan, @ngaythang, @phatsinhno, @phatsinhco
IF @@FETCH_STATUS <> 0 break

-- tính tiền nợ và có cho hàng đầu tiên dựa theo khách hàng và tài khoản
IF @makh <> isnull(@old_makh,'') OR @taikhoan <> isnull(@old_taikhoan,'') BEGIN
SELECT @no = SUM(ISNULL(phatsinhno,0)),
@co = SUM(ISNULL(phatsinhco,0))
FROM dbo.K_candoiphatsinh
WHERE makhach = @makh AND taikhoan = @taikhoan AND ngaythang < @start_date
--RAISERROR ('Có chạy qua tới dòng này...', -1, -1)
--RAISERROR (@no, -1, -1) Mình muốn có 1 cái thông báo giống như MSGBOX trong VB.Net vậy, mục đích là để xem nó có chạy qua không và xem nó là số mấy để mình mò cho dễ, chứ không biết nó có chạy qua không nữa.
--PRINT @no

IF isnull(@no,0) > isnull(@co,0) BEGIN
SELECT @daukyno = isnull(@no,0) - isnull(@co,0), @daukyco = 0
END ELSE BEGIN
SELECT @daukyco = isnull(@co,0) - isnull(@no,0), @daukyno = 0
END
END


IF (@daukyno + @phatsinhno) > (@daukyco + @phatsinhco) BEGIN
SELECT @cuoikyno = (@daukyno + @phatsinhno) - (@daukyco + @phatsinhco), @cuoikyco = 0
END ELSE BEGIN
SELECT @cuoikyco = (@daukyco + @phatsinhco) - (@daukyno + @phatsinhno), @cuoikyno = 0
END
--RAISERROR ('Có chạy qua tới dòng này...', -1, -1)
UPDATE #temp
SET daukyno = @daukyno,
daukyco = @daukyco,
phatsinhno = @phatsinhno,
phatsinhco = @phatsinhco,
cuoikyno = @cuoikyno,
cuoikyco = @cuoikyco
WHERE makhach = @makh AND taikhoan = @taikhoan AND ngaythang = @ngaythang AND id = @id AND stt = @stt AND idcon = @idcon

SELECT @old_makh = @makh, @old_taikhoan = @taikhoan,
@daukyno = @cuoikyno, @daukyco = @cuoikyco
END
CLOSE congno_cur;
DEALLOCATE congno_cur;

SELECT * FROM #temp
ORDER BY makhach, taikhoan, ngaythang

DROP TABLE #temp
END[/sql]
FlyingFox
Guru
Guru
Bài viết: 833
Ngày tham gia: Thứ 4 20/04/2011 9:56 am
Been thanked: 326 times

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by FlyingFox »

OK, vậy nếu mã khách và tài khoản không có trong kỳ phát sinh thì chĩ hiễn thị 1 dòng cho mã khách, tài khoản và ngày =max(ngaythang) với daukyco = cuoikyco, daukyno = cuoikyno và phatsinhco = phatsinhno = cuoikyno = cuoikyco =0.
[sql]DROP PROCEDURE sp_baocao_congno
GO

CREATE PROCEDURE sp_baocao_congno
@makhach nvarchar(50) = NULL,
@mataikhoan nvarchar(50) = NULL,
@start_date datetime,
@end_date datetime
AS BEGIN
DECLARE @makh nvarchar(50), @ngaythang datetime, @taikhoan nvarchar(50),
@old_makh nvarchar(50), @old_taikhoan nvarchar(50),
@nodauky FLOAT, @phatsinhno FLOAT, @phatsinhco FLOAT,
@daukyno FLOAT, @daukyco FLOAT, @co FLOAT, @no FLOAT,
@cuoikyno FLOAT, @cuoikyco FLOAT

SELECT @old_makh = '', @old_taikhoan = ''

SELECT makhach,
taikhoan,
ngaythang,
CONVERT(FLOAT, 0) AS daukyno,
CONVERT(FLOAT, 0) AS daukyco,
SUM(isnull(phatsinhno,0)) AS phatsinhno,
SUM(isnull(phatsinhco,0)) AS phatsinhco,
CONVERT(FLOAT, 0) AS cuoikyno,
CONVERT(FLOAT, 0) AS cuoikyco
INTO #temp
FROM K_candoiphatsinh
WHERE makhach LIKE isnull(@makhach,'') + '%'
AND taikhoan LIKE isnull(@mataikhoan,'') + '%'
AND ngaythang BETWEEN @start_date AND @end_date
GROUP BY makhach, taikhoan, ngaythang

INSERT INTO #temp
SELECT makhach,
taikhoan,
max(ngaythang),
CONVERT(FLOAT, 0) AS daukyno,
CONVERT(FLOAT, 0) AS daukyco,
SUM(isnull(phatsinhno,0)) AS phatsinhno,
SUM(isnull(phatsinhco,0)) AS phatsinhco,
CONVERT(FLOAT, 0) AS cuoikyno,
CONVERT(FLOAT, 0) AS cuoikyco
FROM K_candoiphatsinh
WHERE makhach LIKE isnull(@makhach,'') + '%'
AND taikhoan LIKE isnull(@mataikhoan,'') + '%'
AND ngaythang < @start_date
AND NOT EXISTS (select 1 from #temp where makhach = K_candoiphatsinh.makhach and taikhoan = K_candoiphatsinh.taikhoan)
GROUP BY makhach, taikhoan

DECLARE congno_cur CURSOR FOR
SELECT makhach, taikhoan, ngaythang, phatsinhno, phatsinhco
FROM #temp
ORDER BY makhach, taikhoan, ngaythang
OPEN congno_cur
while 1 = 1 BEGIN
fetch congno_cur INTO @makh, @taikhoan, @ngaythang, @phatsinhno, @phatsinhco
IF @@FETCH_STATUS <> 0 break

-- tính tiền nợ và có cho hàng đầu tiên dựa theo khách hàng và tài khoản
IF @makh <> isnull(@old_makh,'') OR @taikhoan <> isnull(@old_taikhoan,'') BEGIN
SELECT @no = SUM(ISNULL(phatsinhno,0)),
@co = SUM(ISNULL(phatsinhco,0))
FROM dbo.K_candoiphatsinh
WHERE makhach = @makh AND taikhoan = @taikhoan AND ngaythang < @ngaythang
IF isnull(@no,0) > isnull(@co,0) BEGIN
SELECT @daukyno = isnull(@no,0) - isnull(@co,0), @daukyco = 0
END ELSE BEGIN
SELECT @daukyco = isnull(@co,0) - isnull(@no,0), @daukyno = 0
END
END

IF (@daukyno + @phatsinhno) > (@daukyco + @phatsinhco) BEGIN
SELECT @cuoikyno = (@daukyno + @phatsinhno) - (@daukyco + @phatsinhco), @cuoikyco = 0
END ELSE BEGIN
SELECT @cuoikyco = (@daukyco + @phatsinhco) - (@daukyno + @phatsinhno), @cuoikyno = 0
END

-- Nếu mã khách và tài khoản không có trong kỳ phát sinh (<@start_date) thì
-- chĩ hiễn thị 1 dòng cho mã khách, tài khoản và ngày =max(ngaythang)
-- với daukyco = cuoikyco, daukyno = cuoikyno và phatsinhco = phatsinhno = cuoikyno = cuoikyco =0.
IF @ngaythang < @start_date begin
select @daukyno = @cuoikyno, @daukyco = @cuoikyco
select @cuoikyno = 0, @cuoikyco = 0, @phatsinhno = 0, @phatsinhco = 0
end

UPDATE #temp
SET daukyno = @daukyno,
daukyco = @daukyco,
phatsinhno = @phatsinhno,
phatsinhco = @phatsinhco,
cuoikyno = @cuoikyno,
cuoikyco = @cuoikyco
WHERE makhach = @makh AND taikhoan = @taikhoan AND ngaythang = @ngaythang

SELECT @old_makh = @makh, @old_taikhoan = @taikhoan,
@daukyno = @cuoikyno, @daukyco = @cuoikyco
END
CLOSE congno_cur;
DEALLOCATE congno_cur;

SELECT * FROM #temp
ORDER BY makhach, taikhoan, ngaythang

DROP TABLE #temp
END[/sql]
muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 553
Ngày tham gia: Thứ 6 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 190 times
Been thanked: 36 times
Tiếp xúc:

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by muaphonui_2010 »

Cảm ơn bạn nhiều nhé.
Nó chạy thật là tuyệt vời, Có lẽ từ đây nó đã mở cho mình một "kỷ nguyên mới" , thấy viết trong PROCEDURE để hơn viết ở ngoài, nhưng do lúc trước không biết cho nó trả về giá trị 1 DataTable để đổ vào Gridcontrol nên cứ mãi viết ở vb.
Mình chế bến lại và thê mắm muối vào , đây là kết quả của mình
[sql] ALTER PROCEDURE [dbo].[sp_baocao_congno_23012015]
@madonvi nvarchar(50) = NULL,
@makhach nvarchar(50) = NULL,
@mataikhoan nvarchar(50) = NULL,
@start_date datetime,
@end_date datetime
AS BEGIN
DECLARE @id INT, @stt INT, @idcon INT, @makh nvarchar(50), @ngaythang datetime, @taikhoan nvarchar(50),
@old_makh nvarchar(50), @old_taikhoan nvarchar(50),
@nodauky FLOAT, @phatsinhno FLOAT, @phatsinhco FLOAT,
@daukyno FLOAT, @daukyco FLOAT, @co FLOAT, @no FLOAT,
@cuoikyno FLOAT, @cuoikyco FLOAT

SELECT @old_makh = '', @old_taikhoan = ''

SELECT id, stt, idcon, makhach,
taikhoan,
ngaythang,
CONVERT(FLOAT, 0) AS daukyno,
CONVERT(FLOAT, 0) AS daukyco,
phatsinhno,
phatsinhco,
CONVERT(FLOAT, 0) AS cuoikyno,
CONVERT(FLOAT, 0) AS cuoikyco
INTO #temp
FROM K_candoiphatsinh
WHERE madonvi LIKE isnull(@madonvi,'') + '%'
AND makhach LIKE isnull(@makhach,'') + '%'
AND taikhoan LIKE isnull(@mataikhoan,'') + '%'
AND ngaythang BETWEEN @start_date AND @end_date
ORDER BY makhach, taikhoan, ngaythang, id, stt, idcon
--Insert thêm dữ liệu số dư đầu kỳ của các mã khách và tài khoản không có phát sinh nhưng có số dư
INSERT INTO #temp
SELECT 0,0,0, makhach,
taikhoan,
MAX(ngaythang),
CONVERT(FLOAT, 0) AS daukyno,
CONVERT(FLOAT, 0) AS daukyco,
SUM(isnull(phatsinhno,0)) AS phatsinhno,
SUM(isnull(phatsinhco,0)) AS phatsinhco,
CONVERT(FLOAT, 0) AS cuoikyno,
CONVERT(FLOAT, 0) AS cuoikyco
FROM K_candoiphatsinh
WHERE madonvi LIKE isnull(@madonvi,'') + '%'
AND makhach LIKE isnull(@makhach,'') + '%'
AND taikhoan LIKE isnull(@mataikhoan,'') + '%'
AND ngaythang < @start_date
AND NOT EXISTS (SELECT 1 FROM #temp WHERE makhach = K_candoiphatsinh.makhach AND taikhoan = K_candoiphatsinh.taikhoan)
GROUP BY makhach, taikhoan

--Xóa danh sách khách hàng cần tính quá hạn củ
DELETE T_danhmuckhachhangngaytinhquahan
--Insert lại vào danh sách mới để chút nữa xuống cuối cùng ráp nợ quá hạn vào
INSERT INTO T_danhmuckhachhangngaytinhquahan (makhach, denngay, ngaytinhquahan, taikhoan) select #temp.makhach, @end_date , dbo.fn_expired_date( @end_date, ngaychotno, hanthanhtoan) as ngaytinhquahan, #temp.taikhoan
FROM #temp LEFT OUTER JOIN
dbo.T_danhmuckhachhang ON #temp.makhach = dbo.T_danhmuckhachhang.makhach
GROUP BY #temp.makhach, #temp.taikhoan, dbo.T_danhmuckhachhang.ngaychotno,
dbo.T_danhmuckhachhang.hanthanhtoan

--Dùng con trỏ duyệt qua bảng Temp
DECLARE congno_cur CURSOR FOR
SELECT id, stt, idcon, makhach, taikhoan, ngaythang, phatsinhno, phatsinhco
FROM #temp
ORDER BY makhach, taikhoan, ngaythang, id, stt, idcon
OPEN congno_cur
while 1 = 1 BEGIN
fetch congno_cur INTO @id, @stt, @idcon, @makh, @taikhoan, @ngaythang, @phatsinhno, @phatsinhco
IF @@FETCH_STATUS <> 0 break

-- tính tiền nợ và có cho hàng đầu tiên dựa theo khách hàng và tài khoản
IF @makh <> isnull(@old_makh,'') OR @taikhoan <> isnull(@old_taikhoan,'') BEGIN
SELECT @no = SUM(ISNULL(phatsinhno,0)),
@co = SUM(ISNULL(phatsinhco,0))
FROM dbo.K_candoiphatsinh
WHERE makhach = @makh AND taikhoan = @taikhoan AND ngaythang < @ngaythang
IF isnull(@no,0) > isnull(@co,0) BEGIN
SELECT @daukyno = isnull(@no,0) - isnull(@co,0), @daukyco = 0
END ELSE BEGIN
SELECT @daukyco = isnull(@co,0) - isnull(@no,0), @daukyno = 0
END
END

IF (@daukyno + @phatsinhno) > (@daukyco + @phatsinhco) BEGIN
SELECT @cuoikyno = (@daukyno + @phatsinhno) - (@daukyco + @phatsinhco), @cuoikyco = 0
END ELSE BEGIN
SELECT @cuoikyco = (@daukyco + @phatsinhco) - (@daukyno + @phatsinhno), @cuoikyno = 0
END

-- Nếu mã khách và tài khoản không có trong kỳ phát sinh (<@start_date) thì
-- chĩ hiễn thị 1 dòng cho mã khách, tài khoản và ngày =max(ngaythang)
-- với daukyco = cuoikyco, daukyno = cuoikyno và phatsinhco = phatsinhno = cuoikyno = cuoikyco =0.
IF @ngaythang < @start_date BEGIN
SELECT @daukyno = @cuoikyno, @daukyco = @cuoikyco
SELECT @phatsinhno = 0, @phatsinhco = 0 --Dòng này cần phải cho cuối kỳ = đầu kỳ, vì khi in nó cũng cần thể hiện mà , bỏ @cuoikyno = 0, @cuoikyco = 0,
END

UPDATE #temp
SET daukyno = @daukyno,
daukyco = @daukyco,
phatsinhno = @phatsinhno,
phatsinhco = @phatsinhco,
cuoikyno = @cuoikyno,
cuoikyco = @cuoikyco
WHERE makhach = @makh AND taikhoan = @taikhoan AND ngaythang = @ngaythang AND id = @id AND stt = @stt AND idcon = @idcon

SELECT @old_makh = @makh, @old_taikhoan = @taikhoan,
@daukyno = @cuoikyno, @daukyco = @cuoikyco
END
CLOSE congno_cur;
DEALLOCATE congno_cur;

--SELECT * FROM #temp
-- ORDER BY makhach, taikhoan, ngaythang, id, stt, idcon

--Lấy lại thông tin chi tiết cho #temp để đưa ra bảng đầy đủ thông tin
SELECT #temp.id, #temp.stt, #temp.idcon, #temp.makhach, #temp.taikhoan, #temp.ngaythang, #temp.daukyno, #temp.daukyco, #temp.phatsinhno, #temp.phatsinhco, #temp.cuoikyno, #temp.cuoikyco,
machungtu, madonvi, mangoaite, tygiangoaite, sochungtu, dbo.K_candoiphatsinh.tenkhach, nguoigiaodich, diengiai, mahang, tenhang, dvt, makho, soluong, dongia, dongiant, noidung,
taikhoandoiung, loai, dbo.K_candoiphatsinh.nhomhang, dbo.K_candoiphatsinh.nhomkhach, dbo.K_candoiphatsinh.manguoiphutrach, dbo.K_candoiphatsinh.ngaychotno, dbo.K_candoiphatsinh.hanthanhtoan, dbo.K_candoiphatsinh.hanmucno, dvtchinh, soluongchinh, mavatenkhach, #temp.taikhoan + ' - ' + T_danhmuctaikhoan.tentaikhoan AS mavatentaikhoan, denngay, ngaytinhquahan, tongtientinhquahan, tongtienthuquahan, congnohientai, sotienquahan, sotienvuothanmuc
FROM dbo.Q_congnoquahanin RIGHT OUTER JOIN
#temp ON dbo.Q_congnoquahanin.makhach = #temp.makhach AND
dbo.Q_congnoquahanin.taikhoan = #temp.taikhoan LEFT OUTER JOIN
dbo.T_danhmuctaikhoan ON #temp.taikhoan = dbo.T_danhmuctaikhoan.taikhoan LEFT OUTER JOIN
dbo.K_candoiphatsinh ON #temp.id = dbo.K_candoiphatsinh.id AND
#temp.idcon = dbo.K_candoiphatsinh.idcon AND
#temp.taikhoan = dbo.K_candoiphatsinh.taikhoan
ORDER BY makhach, taikhoan, ngaythang, id, stt, idcon


DROP TABLE #temp
END[/sql]
Hình đại diện của thành viên
vietteiv
Quản trị
Quản trị
Bài viết: 1325
Ngày tham gia: Thứ 7 10/02/2007 12:17 am
Đến từ: Cung cấp giải pháp quản lý doanh nghiệp, dự án, tư vấn xây dựng
Has thanked: 6 times
Been thanked: 70 times
Tiếp xúc:

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by vietteiv »

tham gia bàn luận xíu:
- tiêu chí tính công nợ quá hạn như thế nào vậy? theo số ngày được phép nợ hay theo đơn hàng
- có xét đến trường hợp cùng 1 tài khoản, 1 đối tượng nhưng số dư nằm ở 2 bên chưa? (nếu theo dõi công nợ theo đơn hàng sẽ gặp trường hợp này)
muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 553
Ngày tham gia: Thứ 6 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 190 times
Been thanked: 36 times
Tiếp xúc:

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by muaphonui_2010 »

Theo mình thì có các hình thức nợ "chuẩn" sau:
- Nợ theo đơn hàng và thanh toán trong vòng n ngày. VD CHo khách hàng A nợ theo đơn hàng, và thanh toán trong vòng n ngày, VD hôm nay mua và thanh toán trong vòng 15 ngày.Nếu qua 15 ngày chưa thanh toán thì tính là quá hạn.
Trường hợp trên cũng áp dụng cho thu tiền liền luôn. Như vậy thu tiền liên thì theo đơn hàng và thanh toán trong vòng 0 ngày ==> là thu tiền liền.
- Chốt công nợ cuối mỗi tháng và thanh toán trong vòng n ngày: VD khách hàng A cứ cuối mỗi tháng thì chốt số nợ và thanh toán số đó trong vòng n ngày .
- Chốt công nợ vào ngày n của tháng và thanh toán trong vòng n ngày: VD khách hàng A đến ngày 25 mỗi tháng thì chốt công nợ, và thanh toán trong vòng n ngày kể từ ngày chốt nợ.
------------------------------------
-Hình thức công nợ theo hóa đơn, VD khách hàng A mua 3 đơn của 3 ngày khác nhau/ đến khi khách hàng A trả tiền, người ta thích trả đơn nào trước cũng được. Như vậy hình thức này không theo quy luật nào cả/ nên phải làm riêng không nằm chung với các hình thức trên được. Hình thức này khá phổ biến.(nhưng hình thức này cuối cùng cũng có 1 thời hạn nhất định, thì lại dùng cái ở trên)
==> Mình chỉ biết có các hình thức đó thôi.
Ngoài còn có 1 hình thức mà người ta cũng hay dùng đó là "Gối đầu 1 đơn, cứ mua đơn mới trả đơn củ" Nhưng xét về Rủi Ro thì cái này không quản lý được Vì theo theo hình thức này thì người ta không mua nữa thì làm sao thu đơn cuối cùng đây?, gối 1 đơn mà? ==> theo mình hình thức này không phải chuẩn, chỉ áp dụng cho khách hàng nhỏ lẽ cho vui thôi.
--------------------------------
- có xét đến trường hợp cùng 1 tài khoản, 1 đối tượng nhưng số dư nằm ở 2 bên chưa? (nếu theo dõi công nợ theo đơn hàng sẽ gặp trường hợp này)
bạn ví dụ cho trường hợp này xem, mình chưa nghĩ ra trường hợp nào 1 tài khoản, 1 đối tượng phát sinh 2 bên, Mình chỉ biết 1 tài khoản phát sinh 2 bên thôi, VD tài khoản 131, 331..(tài khoản công nợ).?
Hình đại diện của thành viên
vietteiv
Quản trị
Quản trị
Bài viết: 1325
Ngày tham gia: Thứ 7 10/02/2007 12:17 am
Đến từ: Cung cấp giải pháp quản lý doanh nghiệp, dự án, tư vấn xây dựng
Has thanked: 6 times
Been thanked: 70 times
Tiếp xúc:

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by vietteiv »

ví dụ trường hợp 1 tài khoản, 1 đối tượng nhưng số dư nằm ở 2 bên:
Cty bạn và Cty tư vấn xây dựng A ký 2 hợp đồng:
1/ hợp đồng 1: thực hiện hạng mục công việc sửa chữa nhà kho của trường học, thời gian thực hiện hợp đồng là 90 ngày
- hợp đồng này phát sinh n hóa đơn trong quá trình thực hiện
2/ hợp đồng 2: thực hiện hạng mục công việc quét sơn lại các phòng học của dãy nhà X, thời gian thực hiện hợp đồng là 15 ngày
- hợp đồng này phát sinh 1 hóa đơn trong quá trình thực hiện

theo ví dụ trên nếu bạn gộp lại hết số dư công nợ về 1 bên thì không thể theo dõi được công nợ của từng hợp đồng theo từng hóa đơn (thậm chí nhiều khách hàng còn yêu cầu theo dõi công nợ cho từng hạng mục công việc được ghi rõ trong hợp đồng hoặc theo vật tư/sản phẩm)

cũng tùy trường hợp khách hàng (hoặc sếp) không quan tâm lắm đến theo dõi công nợ chi tiết, chỉ cần biết khách hàng đó còn nợ bao nhiêu, quá hạn hay chưa là được.

:)
muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 553
Ngày tham gia: Thứ 6 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 190 times
Been thanked: 36 times
Tiếp xúc:

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by muaphonui_2010 »

Theo mình, trường hợp của bạn là trường hợp công nợ theo hóa đơn (theo hợp đồng, hợp đồng nào , giá trị bao nhiêu, thanh toán dc bao nhiêu, ngày thanh toán ....). Mình nghĩ vậy.
Nhưng mình vẫn xử lý được bằng cách tách thành 2 đối. hehehe
a.duc1088
Bài viết: 1
Ngày tham gia: Thứ 2 05/04/2021 6:58 pm

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by a.duc1088 »

chào bạn. mình hiện tại đang tham khảo đoạn code trên của bạn muaphonui_2010
bạn cho mình hỏi xíu. khi mình chạy sql
[sql]exec sp_baocao_congno
@makhach = '',
@start_date = '2014/01/01',
@end_date = '2015/03/01
mình để mã khách rỗng. nhưng nó chỉ chạy ra được 1 khách hàng đầu tiên
và muốn khách hàng khác thì phải truyền mã vào.
ý mình muốn all tất cả. bạn có thể chỉ mình được không ạ
muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 553
Ngày tham gia: Thứ 6 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 190 times
Been thanked: 36 times
Tiếp xúc:

Re: Nhờ giúp cách tính dư nợ - có lũy kế trong SQL

Gửi bài by muaphonui_2010 »

Chào bạn.
Bạn phải truyền mã khách vào thì nó mới biết được khách đó là khách nào, khách đó đang nợ bao nhiêu...
Vì mỗi khách có thể có định nghĩa công nợ khác nhau và quan trọng là mỗi khách có số liệu công nợ khác như nên phải tính theo khách .
còn của bạn muốn "ý mình muốn all tất cả. bạn có thể chỉ mình được không ạ" vậy sao nó biết khách thứ 2 là khách nào, số liệu công nợ như thế nào để nó tính ?. nên tóm lại là tính công nợ là phải tính theo từng khách ấy bạn.
---------------
Code ở trên là mình load lên 1 danh sách khách hàng cần tính công nợ. rồi sau đó mình lặp qua từng dòng của danh sách để tính công nợ cho khách đó ấy bạn.
Đăng trả lời

Quay về