1

我正在访问并利用 VBA 进行查询,我有变量名,所以我不能在访问中使用查询向导

我有以下 2 个表:

tblKabelInfo

还有一个名称取决于我程序中的其他内容的表

tblName1 as String

表格如下所示:

tblKabelInfo:

+--------------+----------+----------+----------+
| Kabelnummer  |   data   |more data |even more |           
+--------------+----------+----------+----------+
| 1            |    x     |    x     |    x     |
+--------------+----------+----------+----------+
| 2            |    x     |    x     |    x     |
+--------------+----------+----------+----------+
| 3            |    x     |    x     |    x     |
+--------------+----------+----------+----------+
| 4            |    x     |    x     |    x     |
+--------------+----------+----------+----------+

tblName1:

+--------------------------------+----------+----------+
| Filename                       |   bla    | databla  |
+--------------------------------+---------------------+
|\850\850nm_Lessenaar 1_0001.SOR |    x     |    x     |
+--------------------------------+----------+----------+
|\850\850nm_Lessenaar 1_0002.SOR |    x     |    x     |
+--------------------------------+----------+----------+
|\850\850nm_Lessenaar 1_0003.SOR |    x     |    x     |
+--------------------------------+----------+----------+
|\850\850nm_Lessenaar 1_0004.SOR |    x     |    x     |
+--------------------------------+----------+----------+

我知道两个表的大小相同(所以如果表“tblName1”上升到 0234.SOR,我知道“tblKabelInfo”中的 Kabelnummer 也上升到 234)

我想做一个查询,创建一个看起来像这样的新表:

NewTable:

+--------------------------------+--------------+-----+--------+-----------+---------+
| Filename                       |KabelNummer   | bla |databla | More Data |Even more|
+--------------------------------+--------------+--------------+-----------+---------+
|\850\850nm_Lessenaar 1_0001.SOR | 1            |  x  |   x    |     x     |    x    |
+--------------------------------+--------------+-----+--------+-----------+---------+
|\850\850nm_Lessenaar 1_0002.SOR | 2            |  x  |   x    |     x     |    x    |
+--------------------------------+--------------+-----+--------+-----------+---------+
|\850\850nm_Lessenaar 1_0003.SOR | 3            |  x  |   x    |     x     |    x    |
+--------------------------------+--------------+-----+--------+-----------+---------+
|\850\850nm_Lessenaar 1_0004.SOR | 4            |  x  |   x    |     x     |    x    |
+--------------------------------+--------------+-----+--------+-----------+---------+

我想在 1 个表中有 2 个表,共同因素是“文件名”的结尾应该与“KabelNummer”相同

4

3 回答 3

1

试试这个

INSERT INTO tableNew
SELECT B.Filename,
       A.Kabelnummer,
       B.bla,
       B.databla,
       A.data,
       A.[more data],
       A.[even more]
FROM tblKabelInfo A INNER JOIN tblName1  B
ON A.Kabelnummer=CAST(RIGHT(SUBSTRING( B.Filename,1,LEN(SUBSTRING( B.Filename, 0, PATINDEX('%.%', B.Filename)) + '.') - 1),4)

更新以处理文件名中的 4 位数字。00019999

您的查询(编辑)

INSERT INTO tableNew
SELECT B.[Filename],
   A.[Vezelnummer],
   B.[tblVerlies1_Verlies],
   B.[tblVerlies2_Verlies],
   A.[KabelNaam],
   A.[Van],
   A.[Naar],
   A.[VezelLengte],
   A.[TypeKabel],
   A.[TypeConnector],
   A.[AantalConnectoren],
   A.[AantalLassen]
 FROM tblKabelInfo A INNER JOIN tbl_GL_850  B
ON A.Vezelnummer=CAST(RIGHT(SUBSTRING(B.[Filename],1,LEN(SUBSTRING(B.[Filename], 0, PATINDEX('%.%',B.[Filename])) + '.') - 1),4) AS INT)
于 2013-07-24T09:19:08.210 回答
1
SELECT t.Filename,T.bla,T.databla,K.MoreData,K.EvenMore
INTO 
[New Table Name]
FROM tblName1 as T
inner join tblKabelInfo as K
ON CAST(SUBSTRING(T.Filename,[length of filename upto number],1)AS INT)= K.KabelNummer;

没有测试过,但会沿着这些方向进行,我建议查找select into您可以从这里开始。

于 2013-07-24T09:19:18.013 回答
1

似乎这里的基本挑战是识别tblName1.Filename可以用来连接的数字tblKabelInfo.Kabelnummer

如果这些数字始终是字符串最后 8 个字符中的前 4 个,则可以使用RightLeftAccess SQL 兼容的 and 来轻松获取它们。

这是来自立即窗口的会话。

Filename = "\850\850nm_Lessenaar 1_0001.SOR"
? Right(Filename, 8)
0001.SOR
? Left(Right(Filename, 8), 4)
0001

如果需要将这些字符转换为数值,可以使用该Val函数。

? Val(Left(Right(Filename, 8), 4))
 1 

但是,如果Filename值的可变性更大,而不总是以句点和 3 个以上的字符结尾,则任务将更具挑战性。

Filename = "\850\850nm_Lessenaar 1_0001.ABCDEF"
? InstrRev(Filename, "_")
 23 
? InstrRev(Filename, ".")
 28 
? Mid(Filename, InstrRev(Filename, "_") + 1, _
    (InstrRev(Filename, ".") - InstrRev(Filename, "_")) - 1)
0001
? Val(Mid(Filename, InstrRev(Filename, "_") + 1, _
    (InstrRev(Filename, ".") - InstrRev(Filename, "_")) - 1))
 1 

一旦你制定出适当的函数组合来获得你需要的东西,你就可以在你的 Access 查询中使用它们。这是使用这两种方法的查询。它在 Access 2007 中运行没有错误,您的示例数据位于tblName1中。

SELECT
    t.Filename,
    Val(Left(Right(Filename, 8), 4)) AS Kabelnummer1,
    Val(
            Mid(
                Filename,
                InstrRev(Filename, "_") + 1,
                (InstrRev(Filename, ".") - InstrRev(Filename, "_")) - 1
            )
        ) AS Kabelnummer2
FROM tblName1 AS t;
于 2013-07-26T14:56:38.610 回答