如何更改数据库中每个字段的每个格式?

Posted

技术标签:

【中文标题】如何更改数据库中每个字段的每个格式?【英文标题】:How can I change every Format on every field in a database? 【发布时间】:2016-11-23 02:52:23 【问题描述】:

我的任务是对 access 数据库进行一系列更改。其中之一是将数据库中的格式从英国更改为澳大利亚。

数据库中的“成本”字段的类型为货币,但“格式”为“£#,##0.00;-£#,##0.00”。将格式更改为“货币”使其显示为 $,但这些字段在此数据库的不同表中随处可见。

是否有一个中心点来改变它,或者如果没有,是否有一些我可以编写的 VBA 来做到这一点?我试图通过 VBA 脚本,在每个表上使用 For Each 迭代器,但我不明白如何通过该方法更改“格式”字段。

【问题讨论】:

必须更改的不是表格,而是显示值的表单和报表上的控件。所以迭代 Forms、Controls、Property Format 并在找到 £ 时进行调整。 这个应用程序是在英国还是澳大利亚运行?在某些情况下,您可以更改区域设置以获得所需的结果,但是如果您在英国,我怀疑您是否要将它们设置为澳大利亚,否则其他产品可能会出现意外结果。您可以更改掩码和格式,但这可能很残酷。我们部署到 70 多个国家/地区,但由于所有用户都是“美国”员工,我们要求他们坚持使用英语(美国)。 @WayneG.Dunn 格式字段设置为“货币”类型的每个字段的“£#,##0.00;-£#,##0.00”,我的机器设置为澳大利亚地区,但它没有帮助:( 我只是用我在测试中发现的内容的描述替换了我的答案,以及两种可以更改数字格式的方法。一个在设计时,另一个在运行时。 【参考方案1】:

首先,请阅读以下内容,看看是否可以解决您的货币格式问题:http://www.everythingaccess.com/tutorials.asp?ID=Using-the-Currency-field-data-type---without-the-hassle

如果没有,请继续阅读...

经过进一步测试,更改表中字段的“格式”属性似乎对现有表单/报告没有任何帮助。因此,您有两种选择来解决格式问题:(方法 1)是将所有表单/报告的设计视图更改为使用显式格式;或(方法 2)使用一些 VBA 代码在运行时(打开对象时)设置格式属性。如果您有很多字段要更改,选项 (1) 会更容易。阅读选项(方法 2)的说明,然后再做决定。

以下 VBA 代码可以循环遍历所有报表和表单。我目前设置为只处理一个表格和一个报告,我建议你从小处着手,当对结果满意时,处理所有对象。

查看我使用“###”的每个地方,因为它说明了您可以/应该更改的内容。

方法一:

Option Compare Database
Option Explicit

' NOTE!!!! Look at all comments containing '###' for notes
Sub Fix_Reports_and_Forms()
    Change_Form_Properties
    Change_Report_Properties
End Sub

Function Change_Form_Properties()
Dim dbs         As DAO.Database
Dim ctr         As Container
Dim doc         As Document
Dim frm         As Form
Dim ctl         As Control
Dim ObjectName  As String
Dim i           As Integer
Dim bChg        As Boolean

    Set dbs = CurrentDb
    Set ctr = dbs.Containers!Forms

    For Each doc In ctr.Documents
        ObjectName = doc.Name

        '### For testing, I suggest you change the following code to select only ONE Form. Later, remove the IF to do all.
        If ObjectName = "Table1" Then  ' ### If you want to process ALL forms, remove this 'IF' and matching 'End If'
            DoCmd.OpenForm ObjectName, acViewDesign
            DoCmd.Minimize
            Set frm = Forms(doc.Name)
            Debug.Print "Form: " & frm.Name & vbTab & "Ctls: " & frm.Controls.Count
            bChg = False

            For Each ctl In frm.Controls                    ' Loop thru all controls
                If ctl.ControlType = acTextBox Then         ' Is this a TextBox?
                    Debug.Print vbTab & ctl.Name & vbTab & "Type: " & ctl.ControlType & vbTab & "Format: " & ctl.Properties("Format")
                    If ctl.Properties("Format") <> "" Then
                        ' Add code to test if some currency format
                        If ctl.Properties("Format") = "Currency" Then
                            ctl.Properties("Format") = "£#,##0.00;-£#,##0.00"
                            bChg = True
                        ElseIf ctl.Properties("Format") = "$#,##0.00;-$#,##0.00" Then
                            ctl.Properties("Format") = "£#,##0.00;-£#,##0.00"
                            bChg = True
                        Else        ' ### any other formats that need to be changed?
                            ' Add code if needed
                        End If
                    Else
                        ' ### Here I am checking for a specific field name as ControlSource
                        ' This is not needed if you can identify controls by above code.
                        If ctl.Properties("ControlSource") = "CurrFld" Then
                            ctl.Properties("Format") = "£#,##0.00;-£#,##0.00"
                            bChg = True
                        End If
                    End If
                ElseIf ctl.ControlType = acComboBox Then        ' ### Add code for other control types as needed
                    ' Do something if necessary
                End If
            Next ctl
            If bChg = True Then     ' Save changes
                DoCmd.Close acForm, ObjectName, acSaveYes
            Else                    ' Do not Save
                DoCmd.Close acForm, ObjectName, acSaveNo
            End If

        End If              '### Remove if processing ALL Form Names
    Next doc

End Function

Function Change_Report_Properties()
Dim dbs         As DAO.Database
Dim ctr         As Container
Dim doc         As Document
Dim rpt         As Report
Dim ctl         As Control
Dim ObjectName  As String
Dim i           As Integer
Dim bChg        As Boolean

    Set dbs = CurrentDb
    Set ctr = dbs.Containers!Reports

    For Each doc In ctr.Documents
        ObjectName = doc.Name

        '### For testing, I suggest you change the following code to select only ONE Form. Later, remove the IF to do all.
        If ObjectName = "Table1" Then  ' ### If you want to process ALL Reports, remove this 'IF' and matching 'End If'
            DoCmd.OpenReport ObjectName, acViewDesign
            DoCmd.Minimize
            Set rpt = Reports(doc.Name)
            Debug.Print "Report: " & rpt.Name & vbTab & "Ctls: " & rpt.Controls.Count
            bChg = False

            For Each ctl In rpt.Controls
                If ctl.ControlType = acTextBox Then
                    Debug.Print vbTab & ctl.Name & vbTab & "Type: " & ctl.ControlType & vbTab & "Format: " & ctl.Properties("Format")
                    If ctl.Properties("Format") <> "" Then
                        ' Add code to test if some currency format
                        If ctl.Properties("Format") = "Currency" Then
                            ctl.Properties("Format") = "£#,##0.00;-£#,##0.00"
                            bChg = True
                        ElseIf ctl.Properties("Format") = "$#,##0.00;-$#,##0.00" Then
                            ctl.Properties("Format") = "£#,##0.00;-£#,##0.00"
                            bChg = True
                        Else        ' any other formats that need to be changed?
                            ' Add code if needed
                        End If
                    Else
                        '### Here I am checking for a specific field name as ControlSource
                        If ctl.Properties("ControlSource") = "CurrFld" Then
                            ctl.Properties("Format") = "£#,##0.00;-£#,##0.00"
                            bChg = True
                        End If
                    End If
                ElseIf ctl.ControlType = acComboBox Then        ' ### Add code for other control types as needed
                    ' Do something if necessary
                End If
            Next ctl
            If bChg = True Then     ' Save changes
                DoCmd.Close acReport, ObjectName, acSaveYes
            Else                    ' Do not Save
                DoCmd.Close acReport, ObjectName, acSaveNo
            End If

        End If              '### Remove if processing ALL Report Names
    Next doc

End Function

方法二

我在这个站点找到了一种在运行时更改格式的方法:http://donnedwards.openaccess.co.za/2009/03/microsoft-access-and-ten-year-old.html

如果您有许多需要更改格式的字段,所涉及的步骤可能会太难。以下是所需的步骤,然后是一些示例代码。

    在设计视图中打开表单/报告 打开“详细信息部分”的属性 在 TAG 属性中,列出要更改格式的每个控件名称,并用逗号分隔。 添加表单/报告“打开时”事件并插入如下所示的代码。 保存更改

    运行报告/表单

    Option Compare Database
    Option Explicit
    
    Private Sub Report_Open(Cancel As Integer)
    '
    '// Fix up CURRENCY formatting
    '
    Dim strField As String, strTag As String, n As Long
        strTag = Me.Detail.Tag
        If Len(strTag) > 2 Then
            strTag = strTag & ","
            n = InStr(1, strTag, ",")
            While n > 0
                strField = Mid$(strTag, 1, n - 1)
                strTag = Mid$(strTag, n + 1)
                'Me(strField).Format = "Currency"
                Me(strField).Format = "£#,##0.00;-£#,##0.00"
                n = InStr(1, strTag, ",")
            Wend
        End If
    End Sub
    

【讨论】:

谢谢,这看起来是迄今为止最有希望的回应。我可以问一个问题 - 您是否使用内置访问 VBA 编辑器来执行此操作?习惯了Visual Studio IDE和精彩的intellisense,Access中的intellisense似乎有点乱。 是的,我只是使用 Access (Office 2010) 中内置的 VBA 编辑器。您应该可以只复制代码,粘贴到模块中并运行它。【参考方案2】:

您需要遍历TableDefs 并为您希望更改格式的每个字段调用SetProperty。

【讨论】:

感谢约翰。我确实通过 Access 中的 VBA 尝试了这种方法,但我并没有走得太远。你有任何可能有帮助的示例代码吗? @LewisCianci - 这是什么意思 - 你没走多远?您能否展示您尝试过的代码以及发生或未发生的事情?它是否更改了表中的字段格式?您是否也有需要更改的表单字段

以上是关于如何更改数据库中每个字段的每个格式?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改各种微调器值的 EditText 字段

单击每个字段时如何显示和隐藏离子卡?

Http的Header里面包含哪些字段,每个字段有哪些含义?

Hibernate Envers - 获取已更改的字段

如何更改 dumpdata 命令输出夹具中权限字段的格式?

Flutter:当列表数据更改时,getx 控制器未更新。我如何确保添加的每个列表,GetX 控制器都知道这一点?