Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / есть ли такая функция / 18 сообщений из 18, страница 1 из 1
10.10.2006, 15:49:54
    #34044831
Denis_Sql
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
Люди! Кто-нибудь знает, есть функция наподобие LPAD или RPAD для SQL, только для VB ? Увы, справочные материалы под рукой отсутствуют.
...
Рейтинг: 0 / 0
10.10.2006, 16:06:37
    #34044894
A.K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
Стандартную не видел, но самому нетрудно написать.
Вот, к примеру, мой вариант реализации для Delphi 5:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
 // См. описание функции LTRIM в Oracle8i SQL Reference 
 // ------------------------------------------------------- 
 function  ora_LTRIM(S:  string ; TrimSet:  string  = ' '):  string ;
 var  i, TrimCount: integer;
 begin 
  TrimCount := Length(S)+ 1 ;
   for  i:= 1   to  Length(S)  do 
     if  Pos(Copy(S, i,  1 ), TrimSet) =  0   then   begin 
      TrimCount := i; 
      Break;
     end ;
  Result := Copy(S, TrimCount, Length(S)-TrimCount+ 1 );
 end ;

 // См. описание функции RTRIM в Oracle8i SQL Reference 
 // ------------------------------------------------------- 
 function  ora_RTRIM(S:  string ; TrimSet:  string  = ' '):  string ;
 var  i, TrimCount: integer;
 begin 
  TrimCount :=  0 ;
   for  i:=Length(S)  downto   1   do 
     if  Pos(Copy(S, i,  1 ), TrimSet) =  0   then   begin 
      TrimCount := i;
      Break;
     end ;
  Result := Copy(S,  1 , TrimCount);
 end ;

 // См. описание функции LPAD в Oracle8i SQL Reference 
 // ------------------------------------------------------- 
 function  ora_LPAD(S:  string ; Len: integer; Filler :  string  = ' '):  string ;
 begin 
   if  Length(S) >= Len
     then  Result := Copy(S,  1 , Len) 
     else  Result :=
           Copy(DupeString(Filler, ((Len-Length(S))  div  Length(Filler))+ 1 ),
            1 , Len-Length(S)) + S;
 end ;

 // См. описание функции RPAD в Oracle8i SQL Reference 
 // ------------------------------------------------------- 
 function  ora_RPAD(S:  string ; Len: integer; Filler :  string  = ' '):  string ;
 begin 
   if  Length(S) >= Len
     then  Result := Copy(S,  1 , Len)
     else  Result := S +
           Copy (DupeString(Filler, ((Len-Length(S))  div  Length(Filler))+ 1 ),
            1 , Len-Length(S));
 end ;
...
Рейтинг: 0 / 0
10.10.2006, 16:09:04
    #34044899
A.K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
При реализации в VBA вместо паскалевой Copy можно использовать функцию Mid(string, start[, length]), известную еще с ранних бейсиков
...
Рейтинг: 0 / 0
10.10.2006, 16:11:40
    #34044908
Denis_Sql
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
Ну наверное можно и так, хотя хотелось бы "обогатится" в знании VB. По-любому спасибо.
...
Рейтинг: 0 / 0
10.10.2006, 16:21:15
    #34044937
A.K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
Насколько ублюдская справка в VBA... даже список всех функций работы со строками толком не найдешь.
Имеются LTrim(string), RTrim(string), Trim(string), но в отличие от большинства SQLей тримят только пробелы.
String(number, character) - повторяет character заданное число раз, но только - один символ.
В общем, встроенных функций негусто...
...
Рейтинг: 0 / 0
10.10.2006, 16:38:51
    #34044978
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
Я бы сделал так:

Код: plaintext
1.
2.
Function LPAD(ByVal txt As String, sep As String, lng As Single)
    LPAD = String(lng - Len(txt), sep) & txt
End Function

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
10.10.2006, 17:02:04
    #34045052
A.K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
KL (XL)Я бы сделал так:

Код: plaintext
1.
2.
Function LPAD(ByVal txt As String, sep As String, lng As Single)
    LPAD = String(lng - Len(txt), sep) & txt
End Function

KL
[MVP - Microsoft Excel]

Элегантно, только функция String не работает с паттернами из нескольких символов (по крайней мере в OfficXP).
...
Рейтинг: 0 / 0
10.10.2006, 17:04:25
    #34045061
A.K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
Кроме того, в SQL разных СУБД функции LPAD/RPAD тоже реализованы по-разному. К примеру, в Oracle, если длина исходной строки S больше чем требуемое число символов в результирующей строке Len, то производится усечение исходной строки до Len символов.
...
Рейтинг: 0 / 0
10.10.2006, 18:07:21
    #34045289
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
A.K.Кроме того, в SQL разных СУБД функции LPAD/RPAD тоже реализованы по-разному. К примеру, в Oracle, если длина исходной строки S больше чем требуемое число символов в результирующей строке Len, то производится усечение исходной строки до Len символов.
Ну это уж вообще элементарно решается:
Код: plaintext
1.
2.
3.
4.
5.
6.
Function LPAD(ByVal txt As String, sep As String, lng As Single)
    LPAD = Right(String(lng, sep) & txt, lng)
End Function

Function RPAD(ByVal txt As String, sep As String, lng As Single)
    RPAD = Left(txt & String(lng, sep), lng)
End Function
...
Рейтинг: 0 / 0
10.10.2006, 18:43:00
    #34045432
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
White OwlFunction LPAD(ByVal txt As String, sep As String, lng As Single)
LPAD = Right(String(lng, sep) & txt, lng)
End FunctionКрасиво!

Ну и добавим возможность использовать паттерны из нескольких символов:

Код: plaintext
1.
2.
Function LPAD(ByVal txt As String, sep As String, lng As Double)
    LPAD = Right(Application.Rept(sep, lng) & txt, lng)
End Function

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
10.10.2006, 18:45:48
    #34045442
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
Пардон - случайно задекларировал lng как Double :-(


Код: plaintext
1.
2.
Function LPAD(ByVal txt As String, sep As String, lng As Single)
    LPAD = Right(Application.Rept(sep, lng) & txt, lng)
End Function


KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
10.10.2006, 20:07:34
    #34045601
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
Функция Rept взята из Excel, т.ч. из др. приложений или VB нужно будет специально указывать, что Application это Excel :-)

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
11.10.2006, 12:32:28
    #34046820
A.K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
Да, решение теперь стало не только элегантным но и функциональным!
Только вопрос небольшой: в какой версии Excel появилась Application.Rept ?
...
Рейтинг: 0 / 0
11.10.2006, 13:56:27
    #34047269
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
A.K.Да, решение теперь стало не только элегантным но и функциональным!
Только вопрос небольшой: в какой версии Excel появилась Application.Rept ?Не помню, но по-моему в Excel 97 уже была. Эта функция листа, а не VBA. Поэтому при использовании из др. приложений или VB и нужно прибегать к раннему привязыванию (Early Binding), т.е.:

1) установить ссылку в Tools-References... на Microsoft Excel x.x Object Library (где x.x - версия)

2) использовать функцию в таком виде:
Код: plaintext
1.
2.
Function LPAD(ByVal txt As String, sep As String, lng As Single)
    LPAD = Right(Excel.Application.Rept(sep, lng) & txt, lng)
End Function

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
11.10.2006, 14:58:30
    #34047580
A.K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
KL (XL)Не помню, но по-моему в Excel 97 уже была. Эта функция листа, а не VBA. Поэтому при использовании из др. приложений или VB и нужно прибегать к раннему привязыванию (Early Binding), т.е.:

1) установить ссылку в Tools-References... на Microsoft Excel x.x Object Library (где x.x - версия)

2) использовать функцию в таком виде:
Код: plaintext
1.
2.
Function LPAD(ByVal txt As String, sep As String, lng As Single)
    LPAD = Right(Excel.Application.Rept(sep, lng) & txt, lng)
End Function


Все, разобрался. Но не знаю как в других версиях, а у меня это работает только через класс WorksheetFunction (Excel 2002):
Код: plaintext
 LPAD = Right(Application.WorksheetFunction.Rept(sep, lng) & txt, lng)
Напрямую, как у вас - у Application нет такого метода в Excel 2002.
...
Рейтинг: 0 / 0
11.10.2006, 15:17:48
    #34047686
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
A.K.Напрямую, как у вас - у Application нет такого метода в Excel 2002.

Есть точно , но не очевидно . При наборе "Application." функции как свойства не выпадают, но работать должны .

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
11.10.2006, 15:25:40
    #34047738
A.K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
Гляди-ка, и правда! Чудный язык VBA...
...
Рейтинг: 0 / 0
11.10.2006, 15:31:42
    #34047759
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
есть ли такая функция
Вот еще немного инф-ции: http://tinyurl.com/l5fou
Я думаю, что такая форма продолжает существовать для обратной совместимости - в Excle5 писали Application.Sum(...)

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / есть ли такая функция / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]