我想用上个月的数据填充列中的空白字段

时间:2019-08-30 15:28:23

标签: sql vba ms-access access-vba

Table model 我有一个名为“ MYSTERY_SHOPPER”的表,该表已加载每月数据。如您在图像中看到的,二月已加载,但“ Lista de Precio”列中没有值,因此我需要加载上个月的值,比较“ Modelo”列中加载的模型是否相同作为上个月。

Dim rs As Recordset

    Dim datefield As String
    Dim modelfield As String
    Dim pricefield As String

    Dim modeldict As Object

    Set modeldict = CreateObject("Scripting.Dictionary")

    Set rs = CurrentDb.OpenRecordset("MYSTERY_SHOPPER")

    With rs
        .MoveFirst
        Do Until .EOF
            datefield = ![Fecha]
            modelfield = ![Modelo]
            If Not IsNull(![Precio de Lista]) Then
                pricefield = ![Precio de Lista]
                If Not modeldict.Exists(modelfield) Then
                    modeldict.Add modelfield, datefield & "|" & pricefield
                Else
                    If Split(modeldict(modelfield), "|")(0) < datefield Then
                        modeldict(modelfield) = datefield & "|" & pricefield
                    End If
                End If
            Else
                .Edit
                ![Precio de Lista] = Split(modeldict(modelfield), "|")(1)
                .Update
            End If
            .MoveNext
        Loop
    End With

我想到了类似的方法,但是它不起作用,它什么也没做。

请帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用update查询来填充空价格,例如:

update mystery_shopper m
set 
    m.[precio de lista] =
    dlookup
    (
        "[precio de lista]",
        "mystery_shopper",
        "modelo = '" & m.modelo & "' and fecha = " & 
        format
        (
            nz
            (
                dmax
                (
                    "fecha",
                    "mystery_shopper",
                    "modelo = '" & m.modelo & "' and fecha < " & 
                    format(m.fecha,"\#mm\/dd\/yyyy\#")
                )
                ,#1901-01-01#
            )
            ,"\#mm\/dd\/yyyy\#"
        )
    )
where
    m.[precio de lista] is null or m.[precio de lista] = 0

我一直使用域聚合函数dlookupdmax,因为我相信使用相关子查询来获取最新价格将导致查询变得不可更新,尽管可能存在解决这个问题的更好方法。


或者,您可以通过3个步骤解决此问题:

  1. 执行查询以创建一个临时表,其中包含每个modelo的最新价格:

    select m.modelo,
        (
            select top 1 n.[precio de lista]
            from mystery_shopper n
            where n.modelo = m.modelo and n.fecha < m.fecha
            order by n.fecha desc
        ) as precio
    into temp_table
    from
        mystery_shopper m
    where
        m.[precio de lista] is null or
        m.[precio de lista] = 0
    
  2. 使用update查询来更新mystery_shopper表中的价格,从临时表中获取数据:

    update mystery_shopper m inner join temp_table t on m.modelo = t.modelo
    set m.[precio de lista] = t.precio
    where 
        (m.[precio de lista] is null or m.[precio de lista] = 0) and
        t.precio is not null and
        t.precio <> 0
    
  3. 删除临时表:

    drop table temp_table
    

答案 1 :(得分:0)

原因是![Precio de Lista]中存在一个值,该值仅为0。要填充该值,除了null外,还需要检查0。

更改此行:

If Not IsNull(![Precio de Lista]) Then

收件人:

If Not (IsNull(![Precio de Lista]) or ![Precio de Lista] = 0) Then

应该可以解决问题