• Tính giá thời điểm trước đó
  • Tính giá thời điểm trước đó

    tungnht > 28-09-15, 11:55 AM

    Em có 1 bảng như sau

    Field 1: Ngày                           Định dạng: Date/Time
    Field 2: Giá quốc tế                 Định dạng: Number
    Field 3: Giá nội địa                   Định dạng: Number

    Em muốn tại một query báo cáo
    Ngày     Giá qte        Gia nội địa         Giá qte (của record trước đó)           Giá nội địa (của record trước đó)

    Vấn đề là em ko biết phải dùng ntn để lấy được số liệu của record liền trước
    Mong các cao thủ giúp đỡ
  • RE: Nhờ các cao thủ chỉ giáo

    ledangvan > 28-09-15, 12:11 PM

    (28-09-15, 11:55 AM)tungnht Đã viết: Em có 1 bảng như sau

    Field 1: Ngày                           Định dạng: Date/Time
    Field 2: Giá quốc tế                 Định dạng: Number
    Field 3: Giá nội địa                   Định dạng: Number

    Em muốn tại một query báo cáo
    Ngày     Giá qte        Gia nội địa         Giá qte (của record trước đó)           Giá nội địa (của record trước đó)

    Vấn đề là em ko biết phải dùng ntn để lấy được số liệu của record liền trước
    Mong các cao thủ giúp đỡ

    Bạn phải định nghĩa giá trước đó là ngày nào (Giá trước một ngày hay trước một tuần, hay ...) để có cơ sở tính, Khi đã có định nghĩa đó thì tách ra 2 querry : Một là tính giá đến thời điểm hiện tại, hai là tính đến thời điểm trước đó ...
    Sau đó gộp 2 query lại là được
  • RE: Nhờ các cao thủ chỉ giáo

    tungnht > 28-09-15, 03:09 PM

    (28-09-15, 12:11 PM)ledangvan Đã viết:
    (28-09-15, 11:55 AM)tungnht Đã viết: Em có 1 bảng như sau

    Field 1: Ngày                           Định dạng: Date/Time
    Field 2: Giá quốc tế                 Định dạng: Number
    Field 3: Giá nội địa                   Định dạng: Number

    Em muốn tại một query báo cáo
    Ngày     Giá qte        Gia nội địa         Giá qte (của record trước đó)           Giá nội địa (của record trước đó)

    Vấn đề là em ko biết phải dùng ntn để lấy được số liệu của record liền trước
    Mong các cao thủ giúp đỡ

    Bạn phải định nghĩa giá trước đó là ngày nào (Giá trước một ngày hay trước một tuần, hay ...) để có cơ sở tính, Khi đã có định nghĩa đó thì tách ra 2 querry : Một là tính giá đến thời điểm hiện tại, hai là tính đến thời điểm trước đó ...
    Sau đó gộp 2 query lại là được

    Filed 1: VD như là trước 1 ngày đi ạ. Thì câu lệnh là ntn ạ?
  • RE: Nhờ các cao thủ chỉ giáo

    ledangvan > 28-09-15, 03:35 PM

    Bạn phải định nghĩa giá trước đó là ngày nào (Giá trước một ngày hay trước một tuần, hay ...) để có cơ sở tính, Khi đã có định nghĩa đó thì tách ra 2 querry : Một là tính giá đến thời điểm hiện tại, hai là tính đến thời điểm trước đó ...
    Sau đó gộp 2 query lại là được
    [/quote]

    Filed 1: VD như là trước 1 ngày đi ạ. Thì câu lệnh là ntn ạ?
    [/quote]

    Hì, nó quá đơn giản, của bạn đây : http://www.mediafire.com/download/n3fd84...r/Vidu.mdb
  • RE: Tính giá thời điểm trước đó

    tungnht > 28-09-15, 03:57 PM

    Cảm ơn cao thủ đã chỉ giáo. Có điều có cách nào giải quyết trong 1 query mà nó tự động lấy ngày trước đó ko ạ
    E đã thử làm Query bằng SQL nhưng vẫn ko được
  • RE: Tính giá thời điểm trước đó

    ledangvan > 28-09-15, 07:38 PM

    (28-09-15, 03:57 PM)tungnht Đã viết: Cảm ơn cao thủ đã chỉ giáo. Có điều có cách nào giải quyết trong 1 query mà nó tự động lấy ngày trước đó ko ạ
    E đã thử làm Query bằng SQL nhưng vẫn ko được

    Bạn vẫn phải có qr tính giá của ngày hiện tại, ở ví dụ này tôi bớt đi 1 qr
    Ví dụ tôi đã chỉnh, xem đã ưng chưa nhé  014 http://www.mediafire.com/download/n3fd84...r/Vidu.mdb
  • RE: Tính giá thời điểm trước đó

    ongke0711 > 28-09-15, 10:22 PM

    Bạn copy câu SQL này vào Query để lấy giá cũ 1 dòng trước đó xem có đúng ý đồ tác giả không nhé. 

    Mã PHP:
    SELECT Giave.NgayGiave.GiaQTGiave.GiaND,
              (SELECT TOP 1 Prev.GiaQT FROM Giave AS Prev
              WHERE 
    (Prev.Ngay Giave.Ngay)
              ORDER BY Prev.Ngay DESC) AS GiaQTCu,
              (SELECT TOP 1 Prev.GiaND FROM Giave AS Prev
              WHERE 
    (Prev.Ngay Giave.Ngay)
              ORDER BY Prev.Ngay DESC) AS GiaNDCu
    FROM Giave


    [Hình: LayGiaOld.png]
  • RE: Tính giá thời điểm trước đó

    tranthanhan1962 > 28-09-15, 10:56 PM

    (28-09-15, 11:55 AM)tungnht Đã viết: ...
    Vấn đề là em ko biết phải dùng ntn để lấy được số liệu của record liền trước
    ...
     
    (28-09-15, 03:57 PM)tungnht Đã viết: ... mà nó tự động lấy ngày trước đó ko ạ
    ...
     
    Lúc đầu bạn hỏi là “số liệu của record liền trước”. Mình cũng hơi ngờ ngợ, chưa dám trả lời ngay (với lại mình cũng lười tạo cơ sở dữ liệu lắm) 015  . Nhưng sau khi bạn ledangvan trả lời thì bạn xác định là “nó tự động lấy ngày trước”. Hai cái này khác nhau lắm lắm…  007
    1/Nếu là “số liệu của record liền trước” thì có thể nó cùng ngày, trước đó 1 ngày hoặc nhiều ngày (trường hợp trước đó nhiều ngày không có phát sinh)
    2/ Nếu là “nó tự động lấy ngày trước” thì nó sẽ bỏ qua số liệu của ngày hiện tại, nhưng nếu ngày liền trước nó có nhiều record với nhiều giá khác nhau thì nó sẽ lấy record nào? (lớn nhất? nhỏ nhất? trung bình? đầu ngày? cuối ngày?).
    Xin phép mượn tạm ví dụ của bạn ledangvan tạo thêm trên form chonngay 3 textbox: NgayTruoc, GiaQT, GiaND
    Tạm thời tôi giải quyết cho bạn 2 trường hợp. (Không cần tạo query)
    1/ Lấy giá trị của record liền trước.
    Mã:
      Private Sub Command0_Click()
       Dim CSDL As Database
       Dim BangGia As Recordset
     
       Set CSDL = CurrentDb
       Set BangGia = CSDL.OpenRecordset("Giave", DB_OPEN_DYNASET)
       BangGia.MoveLast
       BangGia.MovePrevious
                 NgayTruoc.Value = BangGia![Ngay]
                 GiaQT.Value = BangGia![GiaQT]
                 GiaND.Value = BangGia![GiaND]
        End Sub

    2/Lấy giá trị record cuối cùng của ngày liền trước có phát sinh.
    Mã:
      Private Sub Command0_Click()
       Dim CSDL As Database
       Dim BangGia As Recordset
     
       Set CSDL = CurrentDb
       Set BangGia = CSDL.OpenRecordset("Giave", DB_OPEN_DYNASET)
       BangGia.MoveLast
       Do While Not BangGia.EOF
            If BangGia![Ngay] >= Ngayhientai.Value Then
                 BangGia.MovePrevious
            Else
                 NgayTruoc.Value = BangGia![Ngay]
                 GiaQT.Value = BangGia![GiaQT]
                 GiaND.Value = BangGia![GiaND]
                 Exit Do
            End If
       Loop
       BangGia.Close
       End Sub

    Khi có giá trị các textbox cần thiết tạo report có các textbox có control source = value của các textbox tương ứng trên form là xong.
    Các trường hợp khác khá phức tạp bạn có thể gởi database lên tùy theo trường hợp sẽ xử lý. Thực ra nếu các bạn cần trợ giúp nên tạo CSDL sẳn anh em dễ dàng hỗ trợ hơn. Bởi vì thật khó khăn khi trả lời những câu hỏi chung chung. Nhiều khi không hiểu ý thành ra hỏi một đường trả lời một nẻo.
    Thân
  • RE: Tính giá thời điểm trước đó

    thucgia > 29-09-15, 09:55 PM

    (28-09-15, 10:22 PM)ongke0711 Đã viết: Bạn copy câu SQL này vào Query để lấy giá cũ 1 dòng trước đó xem có đúng ý đồ tác giả không nhé. 

    Mã PHP:
    SELECT Giave.NgayGiave.GiaQTGiave.GiaND,
              (SELECT TOP 1 Prev.GiaQT FROM Giave AS Prev
              WHERE 
    (Prev.Ngay Giave.Ngay)
              ORDER BY Prev.Ngay DESC) AS GiaQTCu,
              (SELECT TOP 1 Prev.GiaND FROM Giave AS Prev
              WHERE 
    (Prev.Ngay Giave.Ngay)
              ORDER BY Prev.Ngay DESC) AS GiaNDCu
    FROM Giave


    [Hình: LayGiaOld.png]

    Cám ơn bạn, Quá dữ luôn. hix xuất hai chiêu liên tiếp .... Prev... trên cả tuyệt vời.
  • RE: Tính giá thời điểm trước đó

    thucgia > 30-09-15, 11:52 PM

    (29-09-15, 09:55 PM)thucgia Đã viết:
    (28-09-15, 10:22 PM)ongke0711 Đã viết: Bạn copy câu SQL này vào Query để lấy giá cũ 1 dòng trước đó xem có đúng ý đồ tác giả không nhé. 

    Mã PHP:
    SELECT Giave.NgayGiave.GiaQTGiave.GiaND,
              (SELECT TOP 1 Prev.GiaQT FROM Giave AS Prev
              WHERE 
    (Prev.Ngay Giave.Ngay)
              ORDER BY Prev.Ngay DESC) AS GiaQTCu,
              (SELECT TOP 1 Prev.GiaND FROM Giave AS Prev
              WHERE 
    (Prev.Ngay Giave.Ngay)
              ORDER BY Prev.Ngay DESC) AS GiaNDCu
    FROM Giave


    [Hình: LayGiaOld.png]

    Cám ơn bạn, Quá dữ luôn. hix xuất hai chiêu liên tiếp .... Prev... trên cả tuyệt vời.


    id    hang_id    N    X
    1    a               2    0
    2    a               0    1
    3    a               1    1


    select id,hang_id,
    (
    SELECT Nz(sum(n)-sum(x),0)
    FROM nx as  prev
    WHERE (((prev.id) < nx.id))
    GROUP BY nx.hang_id;   
    )
    as td,
    n,x,
    td+n-x as tc
    from nx


    id    hang_id    td    n    x    tc
    1    a                       2    0    
    2    a                 2    0    1    1
    3    a                 1    1    1    1


    Hix giúp mình tí, làm sao khỏi bị null cái dòng đầu với!!!