SQL VBA的查询输出与SQL Oracle的查询输出不同



VBA有问题。我写了sql代码(300行),它在sql给出输出中完美地工作:

 Line   Number     Date    Employee    PN       Tax
  1     1111   2015-10-15      AP     6225-6    L1
  2     1111   2015-10-15      AP     6225-6    L2
  3     1111   2015-10-15    (null)   CHARGE    (null)
  4     1111   2015-10-15      AP     55555     L2

我已经将大sql插入到我的VBA代码中,由于某种原因,它与我在ORACLE中看到的不完全匹配。

我在VBA中看到的是这样的(不同的第三行):

 Line   Number     Date    Employee    PN       Tax
  1     1111   2015-10-15      AP     6225-6    L1
  2     1111   2015-10-15      AP     6225-6    L2
  3     1111   (null)        (null)   6225    (null)
  4     1111   2015-10-15      AP     55555     L2

由于某种原因和某种原因,SQL的工作方式不同,并没有在VBA中给出所需的输出。什么会导致这个问题?没有线索,因为我写了两次SQL到VBA中,以防我认为有我的错误。

My VBA code:

Sub Update_table_and_data()
'sql failo suformavimas

Dim con As ADODB.Connection
Dim rec As ADODB.Recordset
Dim cmd As ADODB.Command
Dim sql As String

sql = "Driver={Microsoft ODBC for Oracle}; " & _
"CONNECTSTRING=(DESCRIPTION=" & _
"(ADDRESS=(PROTOCOL=TCP)" & _
"(HOST= ODB)(PORT=1525))" & _
"(CONNECT_DATA=(SERVICE_NAME=ABTL))); uid=ID; pwd=PWD;"
 dat1 = (Sheets("Data").Cells(2, "G"))
 dat2 = (Sheets("Data").Cells(2, "H"))
Set con = New ADODB.Connection
Set rec = New ADODB.Recordset
Set cmd = New ADODB.Command
Sheets("Output").Range("A2:AS999999").ClearContents
If ((Not IsEmpty(dat1)) And (Not IsEmpty(dat2))) Then
  con.Open sql

    Set rec = con.Execute(" SELECT distinct ........
             ' " WHERE i.date >= to_date('" & dat1 & "','YYYY.MM.DD') 
             ' " AND i.date <= to_date('" & dat2 & "','YYYY.MM.DD' ) ) XX   order by    XX.number ")
    If Not rec.EOF Then
            Sheets("Output").Range("A2").CopyFromRecordset rec
            rec.Close
        Else
            MsgBox "PLEASE, CHECK DATE FORMAT!", vbCritical
        End If
    If CBool(con.State And adStateOpen) Then con.Close
    Set rec = Nothing
    Set con = Nothing
End Sub

问题是CopyFromRecordset -它在255个字符截断,它不是唯一的Excel。Range方法。

问题是:我是否有一个不这样做的方法?您是否有一个OLEDB驱动程序,在您甚至到达写入范围的阶段之前对您的记录集进行操作?

您应该在VBA中循环遍历记录集,并检查VBA中的违规字段的长度超过255个字符。如果字段已经被截断,请尝试在连接字符串中使用本地Oracle客户端驱动程序,而不是Microsoft Oracle OLEDB提供程序- Connections.com将拥有该信息。

一旦你知道记录集实际上包含你的数据,没有截断,再次尝试CopyFromRecordset。我实际上并不期望它能写出一个长度超过255个字符的字段,但是自从我遇到这个错误已经有一段时间了,它可能已经修复了,给悲观主义者一个惊喜总是好的。

下一个:

CopyFromRecordset的VBA替代品

这里有三个任务:

  1. 使用数据填充VBA数组变体<代码> Recordset.GetRows()> li>转置数组,因为GetRows是错误的方式Excel;
  2. 确定目标范围的大小并将数组写入Range.Value = Array,是一个重复的任务应该在ArrayToRange()例程中自动执行。

…也许还需要一些辅助工作来编写字段名,但我在简短的回答中忽略了这一点。

最终结果是运行以下代码:

以前

<> <代码>
arraytorrange rngTarget, ArrayTranspose(rst.GetRows)

数组的转置是微不足道的,但这里无论如何:

<代码>公共函数ArrayTranspose(InputArray As Variant)作为变量应用程序。Volatile False
Dim arrOutput作为变量
Dim i As LongDim As LongDim immin As Long昏暗的iMax和我一样长
iMin = LBound(InputArray, 1)iMax = UBound(InputArray, 1)jMin = LBound(InputArray, 2)jMax = UBound(InputArray, 2)
rerem arrOutput(jMin To jMax, iMin To iMax)
For i = iMin To iMax对于j = jMin到jMaxarrOutput(j, i) = InputArray(i, j)下一个我下一个i
ArrayTranspose = arrOutput
结束功能
之前…如果你不添加数组维度检查和在目标单元格中保留公式,ArrayToRange是微不足道的:关键是,如果范围的维度与数组的维度完全匹配,你可以在一次"命中"中写入数据:

<>之前Public Sub arraytorrange (rngTarget)Range, InputArray作为变量将一个数组写入Excel区域,只需在工作表中点击一次InputArray应该是一个形式为Variant(Rows, Columns)的二维结构
'目标范围将自动调整为数组的尺寸,使用'作为起始点的左上角单元格。
这个子程序为常见的VBA和Excel任务节省了重复的编码。
作者:Nigel Heffernan http://Excellerando.blogspot.com

出错时继续下一步
将rngOutput设置为Excel。范围
Dim iRowCount As LongDim iColCount As Long
iRowCount = UBound(InputArray, 1) - LBound(InputArray, 1)iColCount = UBound(InputArray, 2) - LBound(InputArray, 2)
rngTarget。工作表
设置rngOutput = . range (rngTarget.)Cells(1,1), _rngTarget。Cells(iRowCount + 1, iColCount + 1))
应用程序。EnableEvents = False

rngOutput。Value2 = InputArray
应用程序。EnableEvents = True
设置rngTarget = rngOutput '来调整范围的大小,这很有用,大多数时间
以' rngTarget '结束。工作表
终止子

注意:在旧版本的Excel (Office 2000,如果我没记错的话)中,数组'write'仍然被截断为255个字符。这不再是一个问题;如果您仍在使用XL2000,单元格中包含的字符串超过255个字符是一个足够大的问题,您可能希望截断它。

问题是两个查询不相同

在您的VBA版本中有以下内容,但在Oracle版本中没有:

WHERE inh.invoice_date >= to_date('" & dat1 & "','YYYY.MM.DD') 
AND inh.invoice_date <= to_date('" & dat2 & "','YYYY.MM.DD' ) ) XX   

可能还有其他不同之处,但我马上就注意到了。

最新更新