Office中国论坛/Access中国论坛

标题: 怎样快速将所有表的记录(英文字母)全部转换为大写! [打印本页]

作者: 5988143    时间: 2009-3-2 18:33
标题: 怎样快速将所有表的记录(英文字母)全部转换为大写!
怎样快速将所有表的记录(英文字母)全部转换为大写!
呵呵,求助最快最捷径的方法!
作者: todaynew    时间: 2009-3-2 19:18
好大的金子
作者: andymark    时间: 2009-3-2 19:34
有没有中英数子混合的情况
作者: todaynew    时间: 2009-3-2 19:51
本帖最后由 todaynew 于 2009-3-2 19:53 编辑

不知道这算不算最快捷的:
1、建立更新查询
[attach]36170[/attach]
UPDATE 表1 SET 表1.f1 = UCase([f1]), 表1.f2 = UCase([f2]), 表1.f3 = UCase([f2]);
2、运行更新查询
作者: intheend    时间: 2009-3-2 19:56
好诱人噢~~
本人思路:
写一个程序连接第一个表(一个一个来),
读出这个表中字段个数
判断是否是字符串类型
如果是则再判断字符串长度
如果长度>0
读出数据,转成大写再写回
..........
我是个菜鸟,不知道能否实现
不知道有简单的小写转大写的函数,如果没有,只能一个一个字母读出判断再来转了
也不知道能否回写>.<
刚刚上路不要丢鸡蛋
作者: ACMAIN_CHM    时间: 2009-3-2 20:07
所有表的记录(英文字母)全部转换为大写

有些复杂。
常规的做法。通过访问
SELECT Name
FROM MSysObjects
WHERE Type=1 and name not like 'MSys%'
得到所有表名。 或者通过 currentdb.TableDefs , CurrentData.AllTables 等得到所有表名。

然后打开表,得到所有字段名及字段属性。比如用adodb.recordset.fields得到字段名field.name及字段类型field.Type(type=129 char, 200 varchar, 202 VarWChar, 130 WChar), 也可以用DAO的currentdb.TableDefs().Fields().name/type

然后生成update 语句如todaynew所用的 update tableName set fldName=ucase(fldName)

速度上要快一点的话, 可以对每个表生成一个SQL update tableName set fld1=ucase(fld1), fld2=ucase(fld2) ..

可以事先把所有表的索引删除,更新完后再重建以提高速度。
删除所有外键关系,主键,更新完后再重建。



******************
*  一切皆有可能  *
******************

.
ACMAIN - Access论坛回贴准则(个人).
.

.
QQ群 48866293 / 12035577 / 7440532 / 13666209
http://forum.csdn.net/BList/OtherDatabase .
http://www.accessbbs.cn/bbs/index.php .
http://www.accessoft.com/bbs/index.asp .
http://www.access-programmers.co.uk/forums .
http://www.office-cn.net .
.
http://www.office-cn.net/home/space.php?uid=141646 .
作者: Henry D. Sy    时间: 2009-3-2 20:25
  1. Public Sub UCaseAllRecord()
  2.     Dim strTblName() As String
  3.     Dim rs As New ADODB.Recordset
  4.     Dim i As Long, j As Long
  5.     Dim k As Integer
  6.     Dim db As Database
  7.     Dim tbl As DAO.TableDef
  8.     Dim strName As String
  9.     Set db = CurrentDb
  10.     For Each tbl In db.TableDefs
  11.         If Left(tbl.Name, 4) <> "msys" Then
  12.             strName = strName & tbl.Name & ","
  13.         End If
  14.     Next
  15.     strTblName = Split(strName, ",")
  16.     For i = 0 To UBound(strTblName) - 1
  17.         rs.Open strTblName(i), CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  18.         For j = 1 To rs.RecordCount
  19.             For k = 0 To rs.Fields.Count - 1
  20.                 If Not IsNull(rs.Fields(k)) Then
  21.                     rs.Fields(k) = UCase(rs.Fields(k))
  22.                 End If
  23.             Next
  24.             rs.UpdateBatch
  25.             rs.MoveNext
  26.         Next
  27.         rs.Close
  28.     Next
  29.     Set rs = Nothing
  30. End Sub
复制代码

作者: todaynew    时间: 2009-3-2 20:37
Public Sub UCaseAllRecord()
    Dim strTblName() As String
    Dim rs As New ADODB.Recordset
    Dim i As Long, j As Long
    Dim k As Integer
    Dim db As Database
    Dim tbl As DAO.TableDef
...
Henry D. Sy 发表于 2009-3-2 20:25


假设只有三两张表,此法就啰嗦了,呵呵。
作者: pureshadow    时间: 2009-3-2 20:48
ACC里有UPPER这个函数么?
作者: Henry D. Sy    时间: 2009-3-2 20:53
ACC里有UPPER这个函数么?
pureshadow 发表于 2009-3-2 20:48
视乎没有
作者: andymark    时间: 2009-3-2 21:05
基本思路和ACMAIN_CHM 相差无几

更好的方法暂时还没想到
作者: ACMAIN_CHM    时间: 2009-3-2 21:18
没有必要对第个字段进行ucase, 没有必要用recordset对每记录单独处理。
只需要对 char/varchar的字段处理。 一个表用一个UPDATE语句交给jet引擎就行了。



******************
*  一切皆有可能  *
******************

.
ACMAIN - Access论坛回贴准则(个人).
.

.
QQ群 48866293 / 12035577 / 7440532 / 13666209
http://forum.csdn.net/BList/OtherDatabase .
http://www.accessbbs.cn/bbs/index.php .
http://www.accessoft.com/bbs/index.asp .
http://www.access-programmers.co.uk/forums .
http://www.office-cn.net .
.
http://www.office-cn.net/home/space.php?uid=141646 .
作者: 5988143    时间: 2009-3-2 22:18
有没有中英数子混合的情况
andymark 发表于 2009-3-2 19:34


有中英文混合的情况~
作者: ACMAIN_CHM    时间: 2009-3-2 22:29
有中英文混合的情况~
5988143 发表于 2009-3-2 22:18


不会是要把a也变成A吧?!
那除了ucase 还得 replace 26次啊。如果一个 1G 的mdb文件,估计快不起来了。


******************
*  一切皆有可能  *
******************

.
ACMAIN - Access论坛回贴准则(个人).
.

.
QQ群 48866293 / 12035577 / 7440532 / 13666209
http://forum.csdn.net/BList/OtherDatabase .
http://www.accessbbs.cn/bbs/index.php .
http://www.accessoft.com/bbs/index.asp .
http://www.access-programmers.co.uk/forums .
http://www.office-cn.net .
.
http://www.office-cn.net/home/space.php?uid=141646 .
作者: pureshadow    时间: 2009-3-2 23:06
那不如转到EXCEL里,用UPPER函数,再转回ACC……
我闪……
作者: 5988143    时间: 2009-3-3 08:51
Public Sub UCaseAllRecord()
    Dim strTblName() As String
    Dim rs As New ADODB.Recordset
    Dim i As Long, j As Long
    Dim k As Integer
    Dim db As Database
    Dim tbl As DAO.TableDef
...
Henry D. Sy 发表于 2009-3-2 20:25






提示錯誤: -2147217887(80040e21)
作者: Henry D. Sy    时间: 2009-3-3 08:57
提示錯誤: -2147217887(80040e21)
5988143 发表于 2009-3-3 08:51

作者: 5988143    时间: 2009-3-3 11:15
Henry D. Sy 发表于 2009-3-3 08:57


呵呵~找到原因了,不能與  MSADOX.DLL 同時使用~
作者: 5988143    时间: 2009-3-3 12:19
Henry D. Sy 发表于 2009-3-3 08:57


我新添加了兩個新表的數據,無法通過測試~
作者: kangking    时间: 2009-3-3 14:26
Public Sub Capitalization()
    Dim db As DAO.Database
    Dim rsdb As DAO.Recordset
    Dim rs As DAO.Recordset
    Dim sql As String
    Dim qd As DAO.QueryDef
    Dim i As Integer
    Dim upfield As String

    sql = "SELECT MSysObjects.Name, MSysObjects.Type" & _
          " FROM MSysObjects" & _
          " WHERE ((Mid([Name], 1, 4) <> 'Msys') And ((MSysObjects.Type) = 1))"

    Set rsdb = CurrentDb.OpenRecordset(sql)
    Set qd = CurrentDb.QueryDefs("查询1")

    Do Until rsdb.EOF
        Set rs = CurrentDb.OpenRecordset(rsdb(0))
        For i = 0 To rs.Fields.Count - 1
            If rs.Fields(i).Type = dbText Or rs.Fields(i).Type = dbMemo Then
                upfield = upfield & rs.Fields(i).Name & "=ucase([" & rs.Fields(i).Name & "]),"
            End If
        Next
        If upfield <> "" Then
            qd.sql = "update [" & rsdb(0) & "] set " & Mid(upfield, 1, Len(upfield) - 1)
            qd.Close
            CurrentDb.Execute "查询1"
            upfield = ""
        End If
        rsdb.Move 1
    Loop
    Set rsdb = Nothing
    Set rs = Nothing
    Set qd = Nothing
   
End Sub

用法,随便建立一个查询,命名为“查询1"
然后运行上面的代码。
上面的代码只对文本字段和备注字段有效。
作者: 5988143    时间: 2009-3-3 15:04
Public Sub Capitalization()
    Dim db As DAO.Database
    Dim rsdb As DAO.Recordset
    Dim rs As DAO.Recordset
    Dim sql As String
    Dim qd As DAO.QueryDef
    Dim i As Integer
    Dim up ...
kangking 发表于 2009-3-3 14:26


呵呵~測試了一下速度挺快的!
作者: 小鸡快跑0822    时间: 2009-3-3 15:08
很同情你 但帮不上忙
作者: simonwong    时间: 2010-7-10 17:38
转帖:
自动转换大写、小写字母的一句代码

作 者:徐军勇
摘 要:在某些特定的窗体控件中,我们可能需要输入的字母统一为大写或小写,如果用“Caps Lock”键来回切换显得不方便,用上述代码即可方便地实现大小写的自动转换。
正 文:


在击键事件中:

1、如果始终要求输入大写字母的代码(小写转大写):KeyAscii = Asc(UCase(Chr(KeyAscii)))

2、如果始终要求输入小写字母的代码(大写转小写):KeyAscii = Asc(LCase(Chr(KeyAscii)))

作者: wattducr    时间: 2010-8-14 23:12
不错,拿不起这钱.
   




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3