Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Access 2010+;VBA:参数化追加查询–;一个作品,两个唐’;t、 但没有错误消息_Vba_Ms Access_Parameterized Query - Fatal编程技术网

Access 2010+;VBA:参数化追加查询–;一个作品,两个唐’;t、 但没有错误消息

Access 2010+;VBA:参数化追加查询–;一个作品,两个唐’;t、 但没有错误消息,vba,ms-access,parameterized-query,Vba,Ms Access,Parameterized Query,这件事让我揪了很久的头发,但我仍然找不到解决办法。我退休前的15年都在Access&VBA工作,所以我的自尊心受到的伤害比头发还大 项目: 一个数据库,用于记录每个艺术家姓名、坐者姓名、绘制日期(已知时)、内容简要细节(可能没有)和肖像位置(如果已知)的肖像。除了肖像细节表之外,还有艺术家信息表和坐者信息表(加上各种查找和其他与此问题无关的表) 我的客户非常希望输入数据,因此她使用艺术家表单(第一个设计的表单)上的备注字段输入该艺术家绘制的肖像的细节——遵循我设定的严格模式(并在尝试处理之前检查

这件事让我揪了很久的头发,但我仍然找不到解决办法。我退休前的15年都在Access&VBA工作,所以我的自尊心受到的伤害比头发还大

项目:

一个数据库,用于记录每个艺术家姓名、坐者姓名、绘制日期(已知时)、内容简要细节(可能没有)和肖像位置(如果已知)的肖像。除了肖像细节表之外,还有艺术家信息表和坐者信息表(加上各种查找和其他与此问题无关的表)

我的客户非常希望输入数据,因此她使用艺术家表单(第一个设计的表单)上的备注字段输入该艺术家绘制的肖像的细节——遵循我设定的严格模式(并在尝试处理之前检查)。这不是问题所在——我的解析例程正确地识别了创建新的sitter记录和肖像记录所需处理的数据:我知道这是真的,因为我的代码到处都是显示VBA对数据解释的消息框(对于调试至关重要!)

解析+过帐的过程简要如下(备注字段分配给一个变量,然后一次解析一个字符):

  • 确定看护人的姓名(始终是新行上的第一个条目)并将其分配给变量,然后(如果相关/如果已知)简要详细信息、绘制日期和位置
  • 一旦到达肖像细节的末尾,它会显示一个消息框,给出例程解释的信息供我确认
  • 然后,它将sitters的名称附加到sitters的表中,并返回新记录的ID。这很有效。然后,它会将相关数据(或者,更确切地说,它应该添加但不添加!)添加到肖像表中,包括坐者ID(以及表单中的艺术家ID)
  • 然后它继续(如果有更多的画像,则在该行,否则在下一行,直到备忘录结束)
  • 最初,这两个追加过程是通过使用database.Execute动态创建的SQL—使用适当的变量构建SQL字符串。但当我发现第二次追加失败时——没有错误消息——我花了几个小时查看了各种技术网站,其中一条消息是通过强烈方式发送的——使用参数化查询!好的,以前没有使用过这些(不是在VBA中——当然我在表单上使用过它们来进行选择和其他查询),所以我建立了一个简单的测试数据库来模拟这个过程,但不会让我的客户的数据处于风险中

    我花了一段时间——以及更多的在线时间——才把它弄对,但是,是的,它处理了所有缺失数据的组合。(顺便说一句,正如您从下面的表defs中注意到的,“绘制的年份”是一个整数字段,当然不接受“null”,我不希望没有日期的字段为零,因此有两个追加肖像查询,一个省略了对“年份”字段的过帐。)

    现在我又回到了实时数据库——附加sitter的查询正在工作,但其他两个没有,同样没有错误消息。那就交给你了,求你了

    TABLE DEFS(我只列出了相关字段;没有字段需要设置为Yes;允许长度为零的字符串):

    TAMARTS:干旱-自动编号;阿诺兹-备忘录;(加上其他字段)

    taSitters\u Sub:ssID–自动编号;ssFullname–文本70;(加上其他字段)

    xtaPortraits:xrID–自动编号;xrArtistRef–长整数(链接到TAMARTS=AND); XRisterRef–长整数(链接到taSitters_sub=ssID);xrPortraitName–文本25;xrLocationCode–文本20;(加上其他字段)

    参数化查询 qu_app_sitter:插入到taSitters_Sub(ssFullname)中,选择[par1]作为Expr1

    qu_app_肖像:插入xtaPortraits(XRATISTREF、XRisterRef、XRYeaptained、xrPortraitName、xrLocationCode)选择[par2]作为Expr1,[par3]作为Expr2,[par4]作为Expr3,[par5]作为Expr4,[par6]作为Expr5

    第一年:将[par2]作为Expr1、[par3]作为Expr2、[par5]作为Expr4、[par6]作为Expr5插入xtaPortraits(XRATISTREF、XRisterRef、xrPortraitName、xrLocationCode)

    VBA的摘录

    (如果我再次启动,我可能会将par2到par6的值输入一个单独的子例程,但虽然这会减少代码量,但我不确定它是否真的更有效!当然,我愿意接受专家的建议!如果我的客户再次启动,我会让她在输入数据之前等待系统完成–m让所有这些都变得多余——或者让她在Excel电子表格中输入数据&我会从那里处理数据。一个人活着,一个人学习[希望如此!)

    1–声明、设置数据库和查询字段: [仅显示相关DIM:

    Private Sub Command77_Click()
    On Error GoTo myError
    
            
        Dim myID As Long            'the ID for the painter
        Dim myName As String        'the name of the sitter
        Dim myDesc As String        'any text description **could include part-dates or other digits
        Dim myLoc As String         'the location code
        Dim myDate As Integer       'myNum converted from string if it's 4 digits
        Dim Errline As Integer       ‘used so error messages get me close to the problem
        
        '**** Now the database stuff
        
        Dim db As DAO.Database
        Dim rs As DAO.Recordset
        Dim mySitterID As Long, myNewRows As Integer
        Dim qd1 As DAO.QueryDef, qd2 As DAO.QueryDef, qd3 As DAO.QueryDef
        Dim par1 As DAO.Parameter, par2 As DAO.Parameter, par3 As DAO.Parameter, par4 As DAO.Parameter, par5 As DAO.Parameter, par6 As DAO.Parameter
        
        '**** Set these once, and turn off in 'Leave'
        
        Set db = CurrentDb()
        Set qd1 = db.QueryDefs("qu_app_sitter")
        Set qd2 = db.QueryDefs("qu_app_portrait")
        Set qd3 = db.QueryDefs("qu_app_portrait_noyear")
    
    2显示调用插入查询和前面消息框的例程 [根据缺少的信息,其中有9个类似但不完全相同]

    MsgBox "Got name & location only" & vbCrLf & vbCrLf & "Sitter:        " & myName & vbCrLf & "Location:  " & myLoc, vbInformation, "LINE  " & Errline
    
    qd1.Parameters("par1").Value = myName
    qd1.Execute
    myNewRows = qd1.RecordsAffected
    MsgBox myNewRows & " record added", vbInformation, "NEW SITTER"
    myNewRows = 0
    qd1.Close
    Set rs = db.OpenRecordset("SELECT @@IDENTITY AS LastID;")
    mySitterID = rs!lastid
    
    qd3.Parameters("par2").Value = myID
    qd3.Parameters("par3").Value = mySitterID
    qd3.Parameters("par5").Value = myDesc
    qd3.Parameters("par6").Value = myLoc
    qd3.Execute
    myNewRows = qd3.RecordsAffected
    MsgBox myNewRows & " record added", vbInformation, "NEW PORTRAIT (year not known)"
    myNewRows = 0
    qd3.close
    
    两个查询都应该插入1行-第一个总是插入,第二个总是报告插入了0行(实际上没有插入任何行)


    我痛苦地意识到,这篇文章比这里的许多文章要长得多,但希望我已经给出了所需的所有信息。

    我快速查看了您的代码。我建议

  • 您是否获得mysiterid的正确值
  • 我不是100%确定,但是@身份不是真正的艺术家吗

  • Meir

    我快速查看了您的代码..我建议

  • 您是否获得mysiterid的正确值
  • 我不是100%肯定,但是