Access交流中心

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

不重复追加数据的求助

yuayua  发表于:2010-07-15 08:58:58  
复制

在窗体追加数据到子窗体中,追加表字段A=被追加表的字段A,B<>B,C<>C

但是运行的时候仍然是全部追加,请老师们看看,该如何修改代码

点击下载此附件

 

Top
煮江品茶 发表于:2010-07-15 10:12:05
比较简单的处理方法是在作为追加数据源的表中加一个已追加标识字段,追加前该字段值为false,追加过程中将该字段更新为true。这样追加的数据源做成已追加标识为fasle的记录集。

yuayua 发表于:2010-07-15 14:02:22

作为追加数据源一般是联合查询中的数据,我附件中的统计数据是就是一个联合查询所得的数据,只是我直接做成了表的形式,所以再添加一个标识字段就不符合实际情况

有没有其它的办法呢?



煮江品茶 发表于:2010-07-15 14:39:12

有是有,可能效率会比较低。

可以写一个自定义函数来判断记录是否存在,或者用dcount函数判断符合条件的记录数是否大于0.



煮江品茶 发表于:2010-07-15 15:12:54

 以下代码未测试,提供一个处理思路。

 

Private Sub Command5_Click()
    Dim rsTjsj As Recordset
    Dim rsjssj As Recordset
    Dim strCriteria As String
    Dim str As String
    Set rsTjsj = CurrentDb.OpenRecordset("统计数据", dbOpenSnapshot)
    Set rsjssj = CurrentDb.OpenRecordset("结算数据", dbOpenDynaset)
    strCriteria = "[电脑编号] = '" & Me.电脑编号 & "'  AND 库存编号 <> '" & rsjssj!库存编号 & "' AND 库存组别 <> '" & rsjssj!库存组别 & "'"
    rsTjsj.FindFirst strCriteria
   
    While Not (rsTjsj.NoMatch)
        str = Me.结算编号 & ";"
        str = str & Me.电脑编号 & ";"
        str = str & rsTjsj!库存编号 & ";"
        str = str & rsTjsj!库存组别 & ";"
        str = str & rsTjsj!预计 & ";"
        str = str & rsTjsj!预购 & ";"
        str = str & rsTjsj!采购 & ";"
        str = str & rsTjsj!进仓 & ";"
        str = str & rsTjsj!出仓 & ";"
        str = str & rsTjsj!预计 - rsTjsj!出仓 & ";"
        If ReEx(str) = False Then
                rsjssj.AddNew
                rsjssj!结算编号 = Me.结算编号
                rsjssj!电脑编号 = Me.电脑编号
                rsjssj!库存编号 = rsTjsj!库存编号
                rsjssj!库存组别 = rsTjsj!库存组别
                rsjssj!预计 = rsTjsj!预计
                rsjssj!预购 = rsTjsj!预购
                rsjssj!采购 = rsTjsj!采购
                rsjssj!进仓 = rsTjsj!进仓
                rsjssj!出仓 = rsTjsj!出仓
                rsjssj!差异 = rsTjsj!预计 - rsTjsj!出仓
                rsjssj.Update
        End If
        rsTjsj.FindNext strCriteria
    Wend
    Me.Refresh
End Sub

 

Private Function ReEx(str As String) As Boolean
Dim rsjssj As Recordset
Dim b As Boolean
Dim i As Long, j As Long
Set rsjssj = CurrentDb.OpenRecordset("结算数据", dbOpenDynaset)
For i = 1 To rsjssj.RecordCount
    b = True
    For j = 0 To rsjssj.Fields.Count - 1
        b = b And (rsjssj.Fields(i).Value = Split(str, ";")(i))
    Next
    If b = True Then
        ReEx = True
        Exit Function
    Else
        rsjssj.MoveNext
    End If
Next
ReEx = False
End Function



yuayua 发表于:2010-07-16 13:59:13

非常感谢,我尝试下



yuayua 发表于:2010-07-16 17:32:28

做了两个查询来解决

1.建立以窗体的电脑编号为条件的查询,筛选出该编号的数据

SELECT 统计数据.电脑编号, 统计数据.库存编号, 统计数据.库存组别, 统计数据.预计, 统计数据.预购, 统计数据.采购, 统计数据.进仓, 统计数据.出仓
FROM 统计数据
GROUP BY 统计数据.电脑编号, 统计数据.库存编号, 统计数据.库存组别, 统计数据.预计, 统计数据.预购, 统计数据.采购, 统计数据.进仓, 统计数据.出仓
HAVING (((统计数据.电脑编号)=[Forms]![窗体1]![电脑编号]));

2.建立以电脑编号,库存组别,库存编号,不重复追加查询

INSERT INTO 结算数据 ( 电脑编号, 库存编号, 库存组别, 预计, 预购, 采购, 进仓, 出仓 )
SELECT 查询1.电脑编号, 查询1.库存编号, 查询1.库存组别, 查询1.预计, 查询1.预购, 查询1.采购, 查询1.进仓, 查询1.出仓
FROM 结算数据 RIGHT JOIN 查询1 ON (结算数据.库存组别 = 查询1.库存组别) AND (结算数据.库存编号 = 查询1.库存编号) AND (结算数据.电脑编号 = 查询1.电脑编号)
WHERE (((结算数据.电脑编号) Is Null) AND ((结算数据.库存编号) Is Null) AND ((结算数据.库存组别) Is Null));

 

3.再在窗体中的按钮去调用追加查询



总记录:6篇  页次:1/1 9 1 :