|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Sator Arepo, Спасибо! Хорошие ссылки. Читаю и изучаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2011, 14:04 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Чтобы использовать регулярные выражения я создал такую функцию: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Код: plaintext 1.
Код: plaintext 1.
Код: plaintext 1.
А вот в VBA и в Jet SQL эти символы не входят в данный диапазон. Код: plaintext 1. 2. 3.
Код: plaintext
Пробую так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2011, 11:38 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Столкнулся как-то с одной проблемой: есть таблица с несколькими полями, из которых в соответствии с требованиями бизнес правил 4 поля (условно назову Field1, Field2, Field3, Field4) должны были всегда либо заполнены, либо пустые, т.е. частичное заполнение не допускается. Тогда я на стороне SQL Server создал вот такой Check Constraint: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Т.е. идея данного Check Constraint состоит в том, что в случае заполнения всех полей или наоборот не заполнения всегда получим в сумме 10, а если хотя бы одно поле не заполнено, тогда как остальные поля заполнены, то уже сумма никак не получится 10. Конечно можно было бы переписать данный код и таким образом: Код: plaintext 1. 2. 3.
Есть ли у кого-нибудь другая более "продвинутая" идея, более красивое решение? Вот пример красивого решения другой проблемы: если нам нужно отфильтровать данные за текущий месяц, то можно использовать вот такой код а запросах: Код: plaintext
Код: plaintext
Код: plaintext
Вот и думаю, а может действительно есть более "красивый" и эффектный Check Constraint? P.S. Вопрос чисто из разряда "спортивный интерес". :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 09:51 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenТ.е. идея данного Check Constraint состоит в том, что в случае заполнения всех полей или наоборот не заполнения всегда получим в сумме 10, а если хотя бы одно поле не заполнено, тогда как остальные поля заполнены, то уже сумма никак не получится 10. Можно сэкономить 8 вызовов функций (4 раза IIF, 4 раза IsNull): Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 10:22 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
qwrqwr, Хороший вариант. :) А вот в SQL Server наверное без CASE WHEN ... THEN ... перевести нельзя? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 10:37 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, так в последнем варианте ведь нет iif или case. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 10:41 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenА вот в SQL Server наверное без CASE WHEN ... THEN ... перевести нельзя?Напрямую нельзя, т.к. там нет логического типа данных, а в Access - есть, да еще и участвующий в неявных преобразованиях (в 0 или -1). ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 10:45 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenСтолкнулся как-то с одной проблемой: есть таблица с несколькими полями, из которых в соответствии с требованиями бизнес правил 4 поля (условно назову Field1, Field2, Field3, Field4) должны были всегда либо заполнены, либо пустые, т.е. частичное заполнение не допускается. Тогда я на стороне SQL Server создал вот такой Check Constraint: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Т.е. идея данного Check Constraint состоит в том, что в случае заполнения всех полей или наоборот не заполнения всегда получим в сумме 10, а если хотя бы одно поле не заполнено, тогда как остальные поля заполнены, то уже сумма никак не получится 10. Конечно можно было бы переписать данный код и таким образом: Код: plaintext 1. 2. 3.
Есть ли у кого-нибудь другая более "продвинутая" идея, более красивое решение? ... Термины вроде "красивое" и "изящное" плохи тем, что предполагают наличие развитых навыков мышления и надежную систему оценок среди любителей красоты. Разумно понизить градус и заменить красивое на прикольное. Есть ли варианты прикольнее? Если 4 поля числовые, то все заполнены можно сформулировать так (sgn(a)*sgn(b)*sgn(c)*sgn(d)) is not null (в расчете на то, что sgn в jet сможет принять null-значения) а все пропущены так (a+b+c+d) is Null для строковых полей можно записать что-то такое все заполнены (sgn(len(a))*sgn(len(b))*sgn(len(c))*sgn(len(d))) is null все пропущены (a+b+c+d) is Null или (len(a)+len(b)+len(c)+len(d)) is Null в принципе, вариант для строк м.б. применим и для чисел. Выбирая между прикольными и нормальными вариантами можно руководствоваться 1)решением о том, какой из вариантов наиболее прямо выражает намеренеия создателя 2) какой из вариантов выглядит привлекательнее с точки зрения последующего сопровождения. как-то так... ясно ли читателю, почему создатель написал (sgn(a)*sgn(b)*sgn(c)*sgn(d)) is not null а не (a*b*c*d) is not null ? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 11:30 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
опечатка, д.б. так все заполнены (sgn(len(a))*sgn(len(b))*sgn(len(c))*sgn(len(d))) is not null ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 11:31 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
врядли это чем-то лучше уже предложенного ... просто - "в копилку" )) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 11:45 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
ёврядли это чем-то лучше хуже =) Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 11:56 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
qwrqwrёврядли это чем-то лучше хуже =) Код: plaintext 1.
хмм, даа )) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 12:02 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
А чем решение в лоб хуже Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 12:03 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
А чем решение в лоб хуже Код: plaintext 1. 2. 3. 4. 5.
Так чересчур понятнее получается, не по "индусский". ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 12:07 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
А чем решение в лоб хуже Код: plaintext 1. 2. 3. 4. 5.
слишком явно выражает намерения создателя. Противно даже сопровождать такое надменное проявление образования. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 12:08 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
согласен. не по-людски получилось :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 12:23 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Как известно, Mid (Mid$) это функция, которая извлекает часть текста. Как-то мне попался код, где функция Mid "вела себя" не так, как обычная VBA функция. Mid принимала значение, а не возвращала как обычные функции (хотя в справочнике Access'а об этом тоже написано, но я как в справочнике особо не рылся до этого, поэтому для меня было полным неожиданностью этот факт). Вот примерчик: Код: plaintext 1. 2. 3. 4. 5. 6.
Т.е. если часть символов в самом тексте надо заменить другими символами, то можно использовать Mid, но только не с правой стороны знака равенства как обычно, а с левой. А вот Left и Right или другие текстовые функции не обладают таким "даром". После этого случая я стал искать ещё другие функции, которые могли бы работать как с правой стороны, так и с левой стороны знака равенства (=), т.е. принимать значения, а не только возвращать. Нашёл ещё 2 функции: это Date (или VBA.Date() ) Time (или VBA.Time() ). Эти функции возвращают не только текущую дату и время, но и могут изменить дату и время компьютера (если пользователь имеет права администратора). Больше пока не нашёл встроенных функций, возвращающих и принимающих параметров. Может быть кто-то подскажет, есть ли ещё такие функции? Чисто экспериментально выяснил, что пользовательские функции, возвращающие некоторые виды объектных переменных (к сожалению не всех видов), обладают таким свойством. Вот примерчик из Excel'а: Копируем значение ячейки "A1" в "A2". Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 19:52 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, без обид - чисто для справки...:)) хелпА97 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 20:13 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
ZezaMstudieren, без обид - чисто для справки...:)) Дык, вроде коллега studieren именно это и сказал... Но зато: studierenЧисто экспериментально выяснил, что пользовательские функции, возвращающие некоторые виды объектных переменных (к сожалению не всех видов), обладают таким свойством. Вот примерчик из Excel'а: Копируем значение ячейки "A1" в "A2". Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Здесь ничего чудесного нет. Главное то, что объект Range имеет свойство по умолчанию Value. Поэтому если мы ставим такой объект слева от знака присваивания, то мы фактически присваиваем что-то его свойству Value. Точно так же можно поступить, например, с объектом Control. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 20:23 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Владимир Саныч... Здесь ничего чудесного нет. Главное то, что объект Range имеет свойство по умолчанию Value. Поэтому если мы ставим такой объект слева от знака присваивания, то мы фактически присваиваем что-то его свойству Value. Точно так же можно поступить, например, с объектом Control. Добрый вечер уважаемый Саныч! Вы не знаете почему такой эффект возможен только с теми пользовательскими функциями, которые возвращают объектный переменный? Вот если функция возвращает число, дату, текст или ещё что-то, то её уже невозможно использовать с левой стороны. Да и что касается свойства объекта по умолчанию, я думаю Вы правы на все 100 %. :) P.S. Цена вопроса чисто "спортивный интерес", не более того. :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 20:43 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Ну и главный вопрос: есть ли ещё такие "универсальные" функции помимо Mid, Date и Time? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 20:49 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenВы не знаете почему такой эффект возможен только с теми пользовательскими функциями, которые возвращают объектный переменный? Вот если функция возвращает число, дату, текст или ещё что-то, то её уже невозможно использовать с левой стороны. Мне казалось, что я именно на этот вопрос сейчас отвечал, но попробую еще раз. Когда мы пишем оператор присваивания, в котором слева стоит объектная переменная, но в нем нет слова Set, то присваивание идет не самому объекту , а его умолчательному свойству. Если это свойство не read-only, то это работает. Даже если сам объект получен как результат обращения к функции. studierenНу и главный вопрос: есть ли ещё такие "универсальные" функции помимо Mid, Date и Time? Увы, не знаю. Сам пользуюсь таким образом только функцией Mid. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 21:02 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, MSDNVisual Basic имеет функцию Mid и оператор Mid. Оба этих элемента влияют на указанное число знаков в строке, но функция Mid возвращает знаки, в то время как оператор Mid заменяет символы. Дополнительные сведения см. в разделе Оператор Mid. http://msdn.microsoft.com/ru-ru/library/05e63829(v=vs.90).aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 21:14 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Sator Arepostudieren, MSDNVisual Basic имеет функцию Mid и оператор Mid. Оба этих элемента влияют на указанное число знаков в строке, но функция Mid возвращает знаки, в то время как оператор Mid заменяет символы. Дополнительные сведения см. в разделе Оператор Mid. http://msdn.microsoft.com/ru-ru/library/05e63829(v=vs.90).aspx +1 тоже самое и касательно Time / Date Time The Time keyword is used in these contexts: Time Function Time Statement --------------- Time Function Returns a Variant (Date) indicating the current system time. Syntax Time Remarks To set the system time, use the Time statement. --------------------------------- Time Statement Sets the system time. Syntax Time = time The required time argument is any numeric expression, string expression, or any combination, that can represent a time. Remarks If time is a string, Time attempts to convert it to a time using the time separators you specified for your system. If it can't be converted to a valid time, an error occurs. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 22:15 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren... Может быть кто-то подскажет, есть ли ещё такие функции? ... [/src] в VBA еще Calendar Посмотрите в просмотрщик объектов. Date и Time - там описаны не как функции, а как property. Раз не сказано, что read-only property, значит могут как отдавать так и принимать значения. Если для для объекта определено одновременно и свойство get и свойство set/let? то имя свойства может быть как слева так и справа в операторе присваивания значения. Mid с левой стороны присвоения - это "настоящий" statement. Настоящие statement-ы являются частью языка, описаны в справке и в библиотеке типов VBA не представлены. ( Как не представлен, например, statement Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] ) По поводу функций, возвращающих объекты, повторюсь за Санычем: Умение оказаться с левой стороны не их собственное свойство и не свойство всех объектов вообще, а только таких объектов, для которых заявлены "свойства по умолчанию". Если для объекта не определено свойство по умолчанию, то возвращающая его функция не может оказаться слева. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 23:36 |
|
|
start [/forum/topic.php?fid=45&startmsg=37428991&tid=1610226]: |
0ms |
get settings: |
12ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
73ms |
get tp. blocked users: |
1ms |
others: | 319ms |
total: | 490ms |
0 / 0 |