Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

请教如何编程或用函数查找另一表中的对应数据

吉  发表于:2017-03-10 11:02:08  
复制

如上图,根据 计算提成表 中的单价,找到 提成等级表 中对应名称型号的百分点返回过来.

规则是单价小于3%那一行的对应型号的,返回1%,大于等于3%且小于5%那一行返回3%,

大于等于5%且小于8%那一行返回5%,大于等于8%那一行返回8%,

比如计算提成表中A1的单价是0.0038,从等级表中找到比5%那一行0.0037大,比8%0.0046小,所以返回5%.

请高手帮忙解决,或者给出思路,十分感谢,愿意提供回报.附件中有以上点击下载此附件两个表.

 

Top
MDZZ 发表于:2017-03-10 13:47:45
个人想法 写函数   直接dlookup好像不行 

吉 发表于:2017-03-10 14:27:43
我的思路把等级表的结构改一下,把数据再具体化,横置一下,好对应,搞成A1A2A3这样一行行的, 这边表就A+1=A1=等于等级表中对应的A1,用DLOOKUP好实现点.

吉 发表于:2017-03-10 14:29:06
把3% 5% 8% 这个变成列

吉 发表于:2017-03-10 14:32:58
EXCEL   中才可以横置粘贴好像,ACCESS不知道行不行

zhf_2003 发表于:2017-03-11 12:50:05
网行者 发表于:2017-03-13 20:44:37

自定义函数计算提成

点击下载此附件

Function TCJS(ByVal GoodsName As String, ByVal Model As String, ByVal Price As Double) As Double
    On Error Resume Next
    
    Dim rst1 As New ADODB.Recordset, rst2 As New ADODB.Recordset
    Dim i As Long
    Dim FieldName As String
    Dim cSQL As String


    rst1.Open "提成等级表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    rst1.MoveFirst
    For i = 0 To rst1.Fields.Count - 1
        If rst1.Fields(i).Name = Model Then
            FieldName = rst1.Fields(i).Name
        End If
    Next


    cSQL = "SELECT 名称,百分点,[" & FieldName & "] from 提成等级表 WHERE 名称='" & GoodsName & "' ORDER BY 百分点"
    rst2.Open cSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
     
    If DMin("[" & FieldName & "]", "提成等级表", "名称='" & GoodsName & "'") > Price Then
        TCJS = 0.01
    ElseIf DMax("[" & FieldName & "]", "提成等级表", "名称='" & GoodsName & "'") <= Price Then
        rst2.MoveLast
        TCJS = rst2.Fields(1).Value
    Else

        rst2.MoveFirst
        Do Until rst2.EOF
            If rst2.Fields(2).Value > Price Then
                rst2.MovePrevious
                TCJS = rst2.Fields(1).Value
                Exit Do
            End If
            rst2.MoveNext
        Loop
    End If


    rst1.Close: Set rst1 = Nothing
    rst2.Close: Set rst2 = Nothing
End Function



吉 发表于:2017-03-14 17:05:59
感谢两位大侠的帮助.谢谢

黑M 发表于:2018-04-04 10:12:58

把等级表的结构改一下,把型号列转置行,代码更容易懂一些。对百分点循环附值即可。结果一样,至于效率怎么样不知道了

Function JS(ByVal GoodsName As String, ByVal Model As String, ByVal Price As Double) As Double
    On Error GoTo Err

    Dim Rst As New ADODB.Recordset
    Dim SQL As String
    SQL = "SELECT 名称,型号,单价,百分点 from 提成等级表 WHERE 名称='" & GoodsName & "' AND 型号='" & Model & "'"
    Rst.Open SQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    
        Rst.MoveFirst
        If Rst!单价 > Price Then
            JS = 0.01
            Exit Function
        End If
        
        Do Until Rst.EOF
            If Price >= Rst!单价 Then JS = Rst!百分点
            Rst.MoveNext
        Loop


    Rst.Close
    Set Rst = Nothing


Exit_ERR:
    Exit Function


Err:
    MsgBox Err.Description
    Resume Exit_ERR
End Function







黑M 发表于:2018-04-04 10:15:34
总记录:9篇  页次:1/1 9 1 :