【问题标题】:Error in NVL function,is there any equivalent function like NVLNVL函数出错,有没有类似NVL的等效函数
【发布时间】:2012-12-09 16:14:46
【问题描述】:

下面的代码是用VBScript编写的。但是Set rs = cmd.Execute这一行抛出了一个错误,指出NVL没有定义。那么你能推荐一个等价的“NVL”吗

        Option Explicit

        Dim conn, cmd, rs
         Dim clauses(34), i
    Dim xlApp, xlBook
    Dim tempDate,LenDate


    Set conn = CreateObject("ADODB.Connection")
    With conn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .ConnectionString = "Data Source=""D:\AravoVB\GE_Wing_To_Wing_Report - Copy.xlsx"";" & _
        "Extended Properties=""Excel 12.0;HDR=Yes"""
    .Open
    End With
    tempDate="[Business Process ID],"
    For i = 0 To 34
    clauses(i) = "[Task" & i + 1 & " Start Date] > [Task" & i + 2 & " Start Date]"
    tempDate=tempDate & "NVL([Task" & i + 1 & " Start Date],sysdate+"& i &"),"
    Next
    LenDate=Len(tempDate)-1
    tempDate=Mid(tempDate,1,LenDate)
    MsgBox(tempDate)

    Set cmd = CreateObject("ADODB.Command")
    cmd.CommandText = "SELECT " & tempDate &" FROM [GEWingToWingMay25$] WHERE [Business Process ID] NOT IN (" & "SELECT [Business Process ID] FROM [GEWingToWingMay25$] WHERE " & Join(clauses, " AND ") & ")"
    MsgBox(cmd.CommandText)
    cmd.ActiveConnection = conn 
    Set rs = cmd.Execute

    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    Set xlBook = xlApp.Workbooks.Add
    xlBook.Sheets(1).Range("A1").CopyFromRecordset cmd.Execute

编辑:

      For i = 0 To 1
      clauses(i) = "IIf(IsNull([Task" & i + 1 & " Start Date]),sysdate+"& i &",[Task" & i + 1 & " Start Date]) > IIf(IsNull([Task" & i + 2 & " Start Date]),sysdate+"& i &",[Task" & i + 2 & " Start Date])"
'tempDate=tempDate & "NVL([Task" & i + 1 & " Start Date],sysdate+"& i &"),"
      Next

错误:获取No value given for one or more required parameters

MsgBox(cmd.CommandText):

SQL

         `SELECT * FROM [GEWingToWingMay25$] WHERE [Business Process ID] NOT IN (SELECT [Business Process ID] FROM [GEWingToWingMay25$] WHERE IIf(IsNull([Task1 Start Date]),Date()+0,[Task1 Start Date]) < IIf(IsNull([Task2 Start Date]),Date()+0,[Task2 Start Date]) OR IIf(IsNull([Task2 Start Date]),Date()+1,[Task2 Start Date]) < IIf(IsNull([Task3 Start Date]),Date()+1,[Task3 Start Date]) OR IIf(IsNull([Task3 Start Date]),Date()+2,[Task3 Start Date]) < IIf(IsNull([Task4 Start Date]),Date()+2,[Task4 Start Date]) OR IIf(IsNull([Task4 Start Date]),Date()+3,[Task4 Start Date]) < IIf(IsNull([Task5 Start Date]),Date()+3,[Task5 Start Date]) OR IIf(IsNull([Task5 Start Date]),Date()+4,[Task5 Start Date]) < IIf(IsNull([Task6 Start Date]),Date()+4,[Task6 Start Date]) OR IIf(IsNull([Task6 Start Date]),Date()+5,[Task6 Start Date]) < IIf(IsNull([Task7 Start Date]),Date()+5,[Task7 Start Date]) OR IIf(IsNull([Task7 Start Date]),Date()+6,[Task7 Start Date]) < IIf(IsNull([Task8 Start Date]),Date()+6,[Task8 Start Date]) OR IIf(IsNull([Task8 Start Date]),Date()+7,[Task8 Start Date]) < IIf(IsNull([Task9 Start Date]),Date()+7,[Task9 Start Date]) OR IIf(IsNull([Task9 Start Date]),Date()+8,[Task9 Start Date]) < IIf(IsNull([Task10 Start Date]),Date()+8,[Task10 Start Date]) OR IIf(IsNull([Task10 Start Date]),Date()+9,[Task10 Start Date]) < IIf(IsNull([Task11 Start Date]),Date()+9,[Task11 Start Date]) OR IIf(IsNull([Task11 Start Date]),Date()+10,[Task11 Start Date]) < IIf(IsNull([Task12 Start Date]),Date()+10,[Task12 Start Date]) OR IIf(IsNull([Task12 Start Date]),Date()+11,[Task12 Start Date]) < IIf(IsNull([Task13 Start Date]),Date()+11,[Task13 Start Date]) OR IIf(IsNull([Task13 Start Date]),Date()+12,[Task13 Start Date]) < IIf(IsNull([Task14 Start Date]),Date()+12,[Task14 Start Date]) OR IIf(IsNull([Task14 Start Date]),Date()+13,[Task14 Start Date]) < IIf(IsNull([Task15 Start Date]),Date()+13,[Task15 Start Date]) OR IIf(IsNull([Task15 Start Date]),Date()+14,[Task15 Start Date]) < IIf(IsNull([Task16 Start Date]),Date()+14,[Task16 Start Date]) OR IIf(IsNull([Task16 Start Date]),Date()+15,[Task16 Start Date]) < IIf(IsNull([Task17 Start Date]),Date()+15,[Task17 Start Date]) OR IIf(IsNull([Task17 Start Date]),Date()+16,[Task17 Start Date]) < IIf(IsNull([Task18 Start Date]),Date()+16,[Task18 Start Date]) OR IIf(IsNull([Task18 Start Date]),Date()+17,[Task18 Start Date]) < IIf(IsNull([Task19 Start Date]),Date()+17,[Task19 Start Date]) OR IIf(IsNull([Task19 Start Date]),Date()+18,[Task19 Start Date]) < IIf(IsNull([Task20 Start Date]),Date()+18,[Task20 Start Date]) OR IIf(IsNull([Task20 Start Date]),Date()+19,[Task20 Start Date]) < IIf(IsNull([Task21 Start Date]),Date()+19,[Task21 Start Date]) OR IIf(IsNull([Task21 Start Date]),Date()+20,[Task21 Start Date]) < IIf(IsNull([Task22 Start Date]),Date()+20,[Task22 Start Date]) OR IIf(IsNull([Task22 Start Date]),Date()+21,[Task22 Start Date]) < IIf(IsNull([Task23 Start Date]),Date()+21,[Task23 Start Date]) OR IIf(IsNull([Task23 Start Date]),Date()+22,[Task23 Start Date]) < IIf(IsNull([Task24 Start Date]),Date()+22,[Task24 Start Date]) OR IIf(IsNull([Task24 Start Date]),Date()+23,[Task24 Start Date]) < IIf(IsNull([Task25 Start Date]),Date()+23,[Task25 Start Date]) OR IIf(IsNull([Task25 Start Date]),Date()+24,[Task25 Start Date]) < IIf(IsNull([Task26 Start Date]),Date()+24,[Task26 Start Date]) OR IIf(IsNull([Task26 Start Date]),Date()+25,[Task26 Start Date]) < IIf(IsNull([Task27 Start Date]),Date()+25,[Task27 Start Date]) OR IIf(IsNull([Task27 Start Date]),Date()+26,[Task27 Start Date]) < IIf(IsNull([Task28 Start Date]),Date()+26,[Task28 Start Date]) OR IIf(IsNull([Task28 Start Date]),Date()+27,[Task28 Start Date]) < IIf(IsNull([Task29 Start Date]),Date()+27,[Task29 Start Date]) OR IIf(IsNull([Task29 Start Date]),Date()+28,[Task29 Start Date]) < IIf(IsNull([Task30 Start Date]),Date()+28,[Task30 Start Date]) OR IIf(IsNull([Task30 Start Date]),Date()+29,[Task30 Start Date]) < IIf(IsNull([Task31 Start Date]),Date()+29,[Task31 Start Date]) OR IIf(IsNull([Task31 Start Date]),Date()+30,[Task31 Start Date]) < IIf(IsNull([Task32 Start Date]),Date()+30,[Task32 Start Date]) OR IIf(IsNull([Task32 Start Date]),Date()+31,[Task32 Start Date]) < IIf(IsNull([Task33 Start Date]),Date()+31,[Task33 Start Date]) OR IIf(IsNull([Task33 Start Date]),Date()+32,[Task33 Start Date]) < IIf(IsNull([Task34 Start Date]),Date()+32,[Task34 Start Date]) OR IIf(IsNull([Task34 Start Date]),Date()+33,[Task34 Start Date]) < IIf(IsNull([Task35 Start Date]),Date()+33,[Task35 Start Date]) OR IIf(IsNull([Task35 Start Date]),Date()+34,[Task35 Start Date]) < IIf(IsNull([Task36 Start Date]),Date()+34,[Task36 Start Date]))`

编辑

选项显式

Dim conn, cmd, rs
     Dim clauses(34), i
Dim xlApp, xlBook
Dim tempDate,LenDate


Set conn = CreateObject("ADODB.Connection")
With conn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "Data Source=""D:\AravoVB\Final Scripts\GE_Wing_To_Wing_Report - Copy.xlsx"";" & _
    "Extended Properties=""Excel 12.0;HDR=Yes"""
.Open
End With
'tempDate=""
For i = 0 To 34
clauses(i) = "IIf(IsNull([Task" & i + 1 & " Start Date]),Date()+"& i &",[Task" & i + 1 & " Start Date]) < IIf(IsNull([Task" & i + 2 & " Start Date]),Date()+"& i &",[Task" & i + 2 & " Start Date])"
tempDate=tempDate & "NVL([Task" & i + 1 & " Start Date],Date()+"& i &"),"
Next
'LenDate=Len(tempDate)-1
'tempDate=Mid(tempDate,1,LenDate)
MsgBox(tempDate)

Set cmd = CreateObject("ADODB.Command")
cmd.CommandText = "SELECT * FROM [GEWingToWingMay25$] WHERE [Business Process ID] NOT IN (" & "SELECT [Business Process ID] FROM [GEWingToWingMay25$] WHERE " & Join(clauses, " OR ") & ")"
MsgBox(cmd.CommandText)
cmd.ActiveConnection = conn 
Set rs = cmd.Execute

Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
Set xlBook = xlApp.Workbooks.Add
xlBook.Sheets(1).Range("A1").CopyFromRecordset cmd.Execute
'xlBook.Sheets(1).Cells(1,25).Value=cmd.CommandText

【问题讨论】:

  • 我可能是错的,但我猜的等价物是 NZ() ?语法:NZ(field, valuehereif_field_isnull)
  • @SiddharthRout NZ 返回一个错误,在表达式中显示Undefined function 'NZ'
  • 也许 Nz 需要启用库引用....在 Excel 中使用时...只是一个想法。
  • @bonCodigo 由于某些日期列中没有值,此脚本失败,因为 sql where 子句无法正确评估,返回所有行,这不是目的!因此尝试了一些不同的方法,以便 SQL 比较直到 Date 列中有值。在这方面你有什么建议吗?
  • @bonCodigo 对我的上述声明有什么想法吗?

标签: excel vbscript ado adodb vba


【解决方案1】:

这回答了您关于 NVL,Nz 等效项的问题。

只需使用IIF(IsNull())..

因为Nz 仅在 Access 中受支持。

Here is the reference article :

在 Access 之外的 JET 数据库查询中可用的唯一非内在 SQL 函数是那些在 VBA 库中找到的函数,其对象通过底层 JET 数据库引擎公开以供使用(考虑到某些沙盒限制)。您可以使用 VBA 的 IPmt() 和 PPmt() 等函数在查询中执行一些疯狂复杂的计算,您可以使用 VBA 的 IIf() 评估条件逻辑,但不能通过 Nz() 列来克服Null 值,因为 Nz() 是 Access.Application 对象的方法

那么 Nz() 的替代方法是什么?好吧,您可以结合 VBA 的 IIf() 和 IsNull() 来做同样的事情:

select IIf(IsNull(SomePossiblyNullField), '', SomePossiblyNullField) 
from SomeTable 

或者,如果您正在处理可能为 Null 的字符串值,您可以利用不符合标准的 JET SQL 语法的显式串联运算符 (&),它与 ​​VBA 共享,并在您的值上加上一个空字符串。以下查询将产生与前一个相同的结果:

select SomePossiblyNullField & '' 
from SomeTable 

我说不符合是因为在大多数情况下,通过运算符将 Null 与任何内容组合会导致 Null;但是,连接运算符的工作方式不同,将 Null 视为空字符串。数学运算符,如 +、-、* 等,确实符合标准三值 Null 逻辑,因为它们对任何 Null 值的应用都会导致 Null 表达式,包括 + 应用于字符串的不幸情况,这是 JET 的 SQL由于历史原因,语法和 VBA 仍然允许。


以下是错误的可能原因:NO VALUE GIVEN FOR ONE OR MORE PARAMETERS。

Reference article:

  • 原因 1:工作表的第一行是否包含列名。如果是,则连接字符串应包括扩展属性HDR=YES,否则为HDR=NO您已经设置了。

  • 原因 2:Where 子句中使用的 SQL 表达式和列名。这似乎是您出错的最可能原因。

您可以将您的查询字符串编辑如下: SYSDATE 需要被视为 Excel Date() 并使用 DateSerial() 添加天数,然后使用 Format() 维护日期格式。

Format(DateSerial(Year(Date),Month(Date),Day(Date) + i), "yyyy-mm-dd")

对于where 子句,最好使用Switch 语句并确保添加默认条件,例如Date &lt; Date + 1 或它认为的那样。

【讨论】:

  • ..Start Date],sysdate+"&amp; i &amp;")," 你在这里看到逗号, 了吗?你能把它去掉吗?然后尝试Nz 确认它不起作用并使用IIF(IsNull()) 确认它是否有效......我在移动设备上非常渴望听到输出;-)
  • 因为 date() 函数没有达到我的预期,我将它添加到处理没有记录日期值的列,但代码仍然将那些作为坏数据获取,如果 date()在那里工作。
  • IIF(IsNull(var),"",var) 不工作或 date() 不工作!
  • 此代码的任何解决方法,您建议至少对我有用吗?
  • 谢谢,这个答案有助于决定是使用 Nz() 还是 IIf(IsNull()) 为我的空值赋值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多