Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: типо как избавиться от лишних точек
 
 автор: Explorer   (01.03.2007 в 16:50)   личное сообщение
 
 

при сокращении Ф.И.О. до инициалов или плюсы (+) неявного приведения типа данных

иногда, например при подготовке источника записей для отчета, требуется объединять значения
из разных полей таблицы или запроса в одну строку. Самый распространенный случай,

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 вместо лишних скобок и пробела


ЗЫ

напомню про подводные камни :)

если в "сливаемых" полях таблицы будут содержаться числовые значения (цифры), то такое неявное преобразование может привести к неожиданным сюрпризам

например строковые значения могут быть истолкованы как числовые, в этом случае оперция сложения может быть выполнена буквально

  Ответить  
 
 автор: ГлазастыйМышь   (01.03.2007 в 17:31)   личное сообщение
 
 

я таким макаром собираю хитрые выборки на лету

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

  Ответить  
 
 автор: KrukVN   (01.03.2007 в 17:55)   личное сообщение
8 Кб.
 
 

посмотри файлик

  Ответить  
 
 автор: Explorer   (01.03.2007 в 18:11)   личное сообщение
50 Кб.
 
 

об этом я и писал в своем сообщении

это не был вопрос, просто такая напоминалка-примерчик для начинающих практикующих - типо чем отличаеццо "+" от "&" при конкатенации


***************** а вот теперь и вопрос (plz find attached) *************************

кто такие вообще эти Каримовы Муталибовы Масалиевы?

  Ответить  
 
 автор: KrukVN   (01.03.2007 в 18:18)   личное сообщение
 
 

простите, много было букофф - не дочитал наверное
моя думать есть трабл - ну и типа ответил

  Ответить  
 
 автор: ИгорьК   (02.03.2007 в 14:36)   личное сообщение
 
 

Какая мелочь, а как успокоила мою головную боль.
У меня при сокращении Ф.И.О.всегда проблемы с этим были и немог сообразить.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList