
Сентябрь 2005
Об Oracle легко и доступно
Пол Вебстер
Использование Oracle-функция "INITCAP"
(Using Oracle's "INITCAP", by Paul Webster)
Источник: сайт searchDatabase.com, раздел "Database Tips",
http://searchoracle.techtarget.com/tip/1,289483,sid41_gci910437,00.html,
22 октября 2001, рейтинг 5.00 (из 5)
Я всегда считал очень полезным применение Oracle-функции "INITCAP" при построении имен и адресов в SQL-отчетах, когда процессор данных использует все символы как верхнего (upper), так и нижнего (lowercase) регистров. Применение этой функции делает отчет более удобочитаемым, так как она выделяет (initialising) первый символ каждого слова. Однако, эта функция отсутствует в базовом Access. Ниже приводится процедура, которая реализует подобную функциональность. Она разработана как модуль и может быть вызвана из запроса, использовавщего InitCap ([fieldname]).
Любое слово, заключенное в круглые скобки или кавычки, остается неизменным. Все остальные слова преобразуются так, что Первый символ пишется на верхнем регистре, а остальные - на нижнем.
Function InitCap(StrString As Variant) As String
' Разработчик: Paul Webster
' Аналог Oracle-функции INITCAP
' Неалфавитные символы остаются неизменными
' Все, заключеное в двойные или одинарные кавычки, остается неизменным
' Все внутри круглых, фигурных и квадратных скобок({[]}),остается неизменным
Dim StrNew, StrCurrent, StrPrevious As String
Dim x As Integer
x = 1
' If the input string is empty, do now.
If IsNull(StrString) Then
StrNew = " "
Else
' Prime previous character string
StrPrevious = Left$(StrString, 1)
' Clear out new string
StrNew = ""
' Begin loop
Do While x < Len(StrString) + 1
' Load current character
StrCurrent = Mid$(StrString, x, 1)
' Are we at the start of the string?
If x = 1 And StrCurrent <> " " Then
' If no leading spaces then make uppercase
StrNew = StrNew + UCase$(StrCurrent)
Else
' Test previous character
Select Case StrPrevious
' Is is a space?
Case Is = " "
' Yes! Is the current character also a space?
If StrCurrent <> " " Then
' No then must be a first character
StrNew = StrNew + UCase$(StrCurrent)
End If
' Is is parenthesis or quotes?
Case Is = Chr$(34), Chr$(39), Chr$(40), Chr$(91), Chr$(123)
' Yes so output as is
StrNew = StrNew + StrCurrent
' Bump up counter
x = x + 1
' Get next character
StrCurrent = Mid$(StrString, x, 1)
' Now loop until closing parenthesis is found
Do While InStr(Chr$(34) + Chr$(39) + ")]}", StrCurrent) = 0
' Outputting as is
StrNew = StrNew + StrCurrent
' Bump up counter
x = x + 1
' Get next character
StrCurrent = Mid$(StrString, x, 1)
' Until final parenthesis
Loop
' Which we output as is
StrNew = StrNew + StrCurrent
Case Else
' OK so make it lowercase
StrNew = StrNew + LCase$(StrCurrent)
End Select
End If
' Set previous character and
StrPrevious = StrCurrent
' Bump up counter
x = x + 1
' Start again
Loop
End If
' Return modified string
InitCap = StrNew
End Function
|