|
|
|
| при сокращении Ф.И.О. до инициалов или плюсы (+) неявного приведения типа данных
иногда, например при подготовке источника записей для отчета, требуется объединять значения
из разных полей таблицы или запроса в одну строку. Самый распространенный случай,
c которым сталкивался, вероятно, каждый - необходимость объединять строковые (String) данные вида
Фамилия | Имя | Отчество
---------+-------------+------------
Иванов | Василий | Львович
Масалиев | Абсамат |
|
в одну строку, разделяя (например) значения Фамилии Имени и Отчества пробелом. В этом нет ничего сложного -
благо функция "&" позволяет легко "склеивать" такие значения, выполняя так называемую конкатенацию:
***********************************
1) [Фамилия] & " " & [Имя] & " " & [Отчество]
Иванов Василий Львович
***********************************
|
Могут встречаться и более экзотические случаи, когда в результат такого "склеивания" нужно включить
не просто пробелы, а дополнительные символы или разделители - например точку после инициалов:
***********************************
2) [Фамилия] & " " & (UCase(Left([Имя];1)) & "." & (UCase(Left([Отчество];1))& "."
Иванов В.Л.
***********************************
|
или, как более экзотический вариант, формирование номера некоторого документа по определенному шаблону.
Например "Договор № ######-YY (***)"
казалось бы и этот случай также не вызовет сложностей - просто вставляем
нужные символы в нужное место - достаточно написать в запросе что-то вроде:
***********************************
3) "Договор № " & [КодДоговора] & "-" & (Format([ДатаЗаключения];"yy") & " (" & [ВерсияДоговора]& ")"
Договор № 780-07 (32)
***********************************
|
но что делать, если некоторые записи таблицы-источника не содержат данных для запроса - например
если у сотрудника нет отчества или у договора нет версии и соответствующее поле таблицы не заполнено.
При использовании описанных выше приемов c конкатенацией и "слиянием" значений получится что-то вроде:
1) "Масалиев Абсамат "
или
2) "Масалиев А.."
или
3) "Договор № 780-07 ()"
в одном случае (1; 2) появится лишняя точка (или пробел) при отсутствии значения в поле "Отчество",
в другом (3) лишние открывающая и закрывающая скобки если нет номера версии договора "ВерсияДоговора".
допустим, в первом случае (1), лишний пробел можно убрать функцией TRIM (RTrim; LTrim), и это совершенно несложно
1) Trim([Фамилия] & " " & [Имя] & " " & [Отчество])
|
но для того, чтобы убать точку или скобки,как в примере (2; 3), пришлось бы использовать громоздкие конструкции с функцией IIF
проверяя наличие значения в поле на Is Not Null, подставляя, соответственно, точку после отчества, или скобки к номеру версии
2) IIF([Отчество]Is Not Null;([Фамилия] & " " & (UCase(Left([Имя];1)) & "." & (UCase(Left([Отчество];1))& ".");([Фамилия] & " " & (UCase(Left([Имя];1)) & "."))
|
3) про скобки в случае с номером договора даже и писать не хочется - тем более, что это еще не самый тяжелый случай,
иногда в отчетах нужно формировать строки и посложнее - с датой договора, фамилиями представителей сторон и проч.
как можно упростить такой хитрый запрос? очень просто - вспомнить правило х + Null = Null и использовать
операцию сложения вместо функции конкатенации, там, где значение некоторго поля может быть равно Null
таким образом выражение вида [Отчество] + "." вернет Null (или строку нулевой длины), если значение поля [Отчество] = Null и в прочих случаях аналогично:
1) [Фамилия] & " " & [Имя] & (" " + [Отчество]) = "Масалиев Абсамат"
т.е. Null вместо лишнего пробела перед отсутствующим отчеством
|
2) [Фамилия] & " " & UCase(Left([Имя];1)) & "." & (UCase(Left([Отчество];1)) + ".") = "Масалиев А."
т.е. Null вместо лишней точки после отсутствующего инициала
|
3) "Договор № " & [КодДоговора] & "-" & Format([ДатаДоговора];"yy") & (" (" + [ВерсияДоговора] + ")") = "Договор № 780-07"
т.е. Null вместо лишних скобок и пробела
|
ЗЫ
напомню про подводные камни :)
если в "сливаемых" полях таблицы будут содержаться числовые значения (цифры), то такое неявное преобразование может привести к неожиданным сюрпризам
например строковые значения могут быть истолкованы как числовые, в этом случае оперция сложения может быть выполнена буквально | |
|
| |
|
|
|
| я таким макаром собираю хитрые выборки на лету
modProm = Nz(DLookup("[VALUE]", "[STRATEGY_OPER_OBJECT_PROPERTY]", "[ID_OBJECT] ='kn29737' AND [ID_PROPERTY]='pr6958'"), "---")
If modProm <> "---" Then
StrFilter = StrFilter + " AND " & "([Vpr6958] Like ('*" & modProm & "*'))"
StrCriteria = StrCriteria + IIf(Len(StrCriteria) = 0, vbNullString, " // ")
StrCriteria = StrCriteria + "Название организации: " & modProm
End If
где StrFilter как Variant и начальное значение как null
таким образом не надо проверять нужен или нет AND в предложении Where | |
|
| |
|
8 Кб. |
|
| посмотри файлик | |
|
| |
|
50 Кб. |
|
| об этом я и писал в своем сообщении
это не был вопрос, просто такая напоминалка-примерчик для начинающих практикующих - типо чем отличаеццо "+" от "&" при конкатенации
***************** а вот теперь и вопрос (plz find attached) *************************
кто такие вообще эти Каримовы Муталибовы Масалиевы?
| |
|
| |
|
|
|
| простите, много было букофф - не дочитал наверное
моя думать есть трабл - ну и типа ответил | |
|
| |
|
|
|
| Какая мелочь, а как успокоила мою головную боль.
У меня при сокращении Ф.И.О.всегда проблемы с этим были и немог сообразить. | |
|
| |