使用两个记录集vba excel

时间:2015-07-31 17:12:49

标签: excel vba

我有这段代码

Public Sub CommandButton1_Click()

Cells.Clear
Dim oConn1 As ADODB.Connection
Dim rs1 As ADODB.Recordset
Dim rs2 As ADODB.Recordset
Set oConn1 = New ADODB.Connection
oConn1.ConnectionString = "Provider=SQLOLEDB.1;Password=" & Contraseña.Text & ";Persist Security Info=True;User ID= " & Usuario.Text & "; Initial Catalog =" & bases.Text & ";Data Source= SERVER\BD;"
oConn1.ConnectionTimeout = 200
oConn1.Open

Set rs1 = New ADODB.Recordset
rs1.ActiveConnection = oConn1

rs1.Source = "DECLARE @id INT" & _
             "SET @id = @@spid" & _
             "INSERT CLIENTES_SALDOS_E (PROCESO_ID, CODIGO_DE_CLIENTE)" & _
             "SELECT @id, CODIGO_DE_CLIENTE" & _
             "FROM CLIENTES" & _
             "WHERE CLIENTES.CODIGO_DE_CLIENTE BETWEEN '" & EXTRA(Ncuenta) & "' AND '" & EXTRA(Ncuenta2) & "'" & _
             "EXECUTE sp_Reconstruccion_saldo_doctos "", '" & EXTRA(Fechacorte) & "', @id"

 Set rs2 = New ADODB.Recordset
 rs2.ActiveConnection = oConn1


 rs2.Source = "SELECT P.NOMBRE_DEPARTAMENTO,M.NOMBRE_MUNICIPIO,R.NOMBRE_TERRITORIO,V.NOMBRE_VENDEDOR,C.CODIGO_DE_CONDICION,E.CODIGO_DE_CLIENTE,C.NOMBRE_CLIENTE,D.CODIGO_MOVIMIENTO," & _
            "D.SERIE_DEL_DOCUMENTO,D.NUMERO_DOCUMENTO,(ME.MONTO_TOTAL * ME.CAMBIO_MONEDA_LOCAL) AS MONTO_MONEDA_LOCAL,D.SALDO_MONEDA_LOCAL,CONVERT(VARCHAR(10),D.FECHA_DOCUMENTO,103) AS FECHA_DOCUMENTO," & _
            "CONVERT(VARCHAR(10),D.FECHA_VENCIMIENTO,103) AS FECHA_VENCIMIENTO,D.DIAS_DE_ANTIGUEDAD," & _
            "CASE WHEN D.DIAS_DE_ANTIGUEDAD =0 THEN D.SALDO_MONEDA_LOCAL  ELSE 0 END AS 'NO VENCIDO'," & _
            "CASE WHEN D.DIAS_DE_ANTIGUEDAD >=1  AND D.DIAS_DE_ANTIGUEDAD <=15 THEN D.SALDO_MONEDA_LOCAL ELSE 0 END AS 'DE 1 A 15 DIAS'," & _
            "CASE WHEN D.DIAS_DE_ANTIGUEDAD >=16 AND D.DIAS_DE_ANTIGUEDAD <=30 THEN D.SALDO_MONEDA_LOCAL ELSE 0 END AS 'DE 16 A 30 DIAS'," & _
            "CASE WHEN D.DIAS_DE_ANTIGUEDAD >=31 AND D.DIAS_DE_ANTIGUEDAD <=60 THEN D.SALDO_MONEDA_LOCAL ELSE 0 END AS 'DE 31 A 60 DIAS'," & _
            "CASE WHEN D.DIAS_DE_ANTIGUEDAD >=61 AND D.DIAS_DE_ANTIGUEDAD <=90 THEN D.SALDO_MONEDA_LOCAL ELSE 0 END AS 'DE 61 A 90 DIAS'," & _
            "CASE WHEN D.DIAS_DE_ANTIGUEDAD >=91 AND D.DIAS_DE_ANTIGUEDAD <=9999 THEN D.SALDO_MONEDA_LOCAL ELSE 0 END AS 'DE 91 A 9999 DIAS'" & _
            "FROM CLIENTES C" & _
            "INNER JOIN CLIENTES_SALDOS_E E ON E.CODIGO_DE_CLIENTE = C.CODIGO_DE_CLIENTE" & _
            "INNER JOIN CLIENTES_SALDOS_D D ON D.CODIGO_DE_CLIENTE = E.CODIGO_DE_CLIENTE AND D.PROCESO_ID = E.PROCESO_ID" & _
            "INNER JOIN MOVIMIENTOS_TIPO T  ON T.CODIGO_MOVIMIENTO = D.CODIGO_MOVIMIENTO" & _
            "INNER JOIN DEPARTAMENTOS P     ON C.CODIGO_DE_PAIS    = P.CODIGO_DE_PAIS    AND C.CODIGO_DEPARTAMENTO = P.CODIGO_DEPARTAMENTO" & _
            "INNER JOIN MUNICIPIOS M        ON C.CODIGO_DE_PAIS    = M.CODIGO_DE_PAIS    AND C.CODIGO_DEPARTAMENTO = M.CODIGO_DEPARTAMENTO AND C.CODIGO_MUNICIPIO = M.CODIGO_MUNICIPIO" & _
            "INNER JOIN TERRITORIOS R       ON C.CODIGO_TERRITORIO = R.CODIGO_TERRITORIO" & _
            "LEFT JOIN CLIENTE_VENDEDOR CV  ON C.CODIGO_DE_CLIENTE = CV.CODIGO_DE_CLIENTE" & _
            "LEFT JOIN VENDEDORES V         ON CV.CODIGO_VENDEDOR = V.CODIGO_VENDEDOR" & _
            "INNER JOIN MOVIMIENTO_ENC ME   ON D.SERIE_DEL_DOCUMENTO = ME.SERIE_DEL_DOCUMENTO AND D.NUMERO_DOCUMENTO = ME.NUMERO_DOCUMENTO AND D.CODIGO_MOVIMIENTO = ME.CODIGO_MOVIMIENTO" & _
            "WHERE E.PROCESO_ID = @id AND T.TIPO_TRANSACCION = 'S' AND D.ID_EMPRESA = 'GN' AND D.ID_SUCURSAL = '01' AND D.ID_CENTRO_OPERATIVO = '001' AND D.SALDO_MONEDA_LOCAL > 0" & _
            "DELETE CLIENTES_SALDOS_E WHERE  PROCESO_ID = @id" & _
            "DELETE CLIENTES_SALDOS_D WHERE  PROCESO_ID = @id"


rs2.Open
encabezados
Range("A2").CopyFromRecordset rs2
'a = rs1.Fields.Count
rs1.Close
rs2.Close
oConn1.Close
MsgBox ("Reporte Generado")
Set rs1 = Nothing
Set rs2 = Nothing
Set oConn1 = Nothing

End If
End Sub

当我运行这段代码时,在'E'错误附近给我一个不正确的语法,我将代码分成两个记录集,因为只有一个给我错误:有很多行的延续,但现在我的语法不正确错误。 我猜错误是因为在记录集2的where子句中,引用了在记录集1上声明的变量,我不知道如何告诉查询到E.PROCESO_ID在记录集1中。

我该如何解决这个问题? 感谢

1 个答案:

答案 0 :(得分:0)

我最好的猜测是问题是这里缺少空格。现在你的陈述是

FROM CLIENTES CINNER JOIN CLIENTES_SALDOS

但应该阅读

FROM CLIENTES C INNER JOIN CLIENTES_SALDOS

所以在每个INNER JOIN前面添加一个空格。