#sql #xcode #forms #ms-access
#sql #xcode #формы #ms-access
Вопрос:
Во-первых, у меня возникла проблема, если бы я хотел оставить поле пустой в своей форме и выполнять поиск только по другому полю (например, если бы у вас было 2 поля, но я хотел выполнить поиск в базе данных только по одному, а другое оставить пустым), это вернуло бы правильные результаты.
Я сделал это с помощью: Like [Forms]![BackUpValidationForm1_3]![AccountCMBO] и «*» во всех полях моей формы и просто изменение области текстового поля на новое текстовое поле. Это сработало как по волшебству.
Но теперь мой новый вопрос заключается в том, что мне нужно сохранить эту функциональность, а также разрешить диапазон.
У меня есть ссылка доступа к таблице сервера. В таблице есть столбец с меньшим номером, а затем отдельный столбец с большим номером. Например, значение low может быть 100, а значение high — 200. Это означает, что любая учетная запись, которая попадает между этими двумя номерами, проходит проверку этой таблицы. Итак, если бы у меня была учетная запись с номером учетной записи 101, и я поместил бы ее в свою форму и нажал кнопку run, она должна вернуть любую строку, в которой оба поля равны 101 (таким образом, low и high равны 101, что означает, что это единственная учетная запись, к которой применяется это правило), и любую другую строку, в которой, скажем, low равно 100, а high равно 200, потому что она находится между ними. У меня есть несколько столбцов, подобных этому, account low и high, function low и high.
В основном, просто используя критерии, с которых я начал (например, [Forms]![BackUpValidationForm1_3]![AccountCMBO] amp; «*») это не привело бы к захвату тех записей, у которых есть диапазон, который может находиться под ним, а затем над ним, что означает, что он где-то посередине.
Я пробовал: Между [ACCOUNT_CD] И [ACCOUNT_CD_HIGH], и это работает само по себе. Но если я добавлю то же самое в другое поле, которое также есть в этой форме, и оставлю это поле пустым, и я просто выполню поиск account в форме, это не даст никаких результатов.
Я попробовал следующее:
Например, «» И между [ACCOUNT_CD] И [ACCOUNT_CD_HIGH] amp; ««, а также пробовал между [ACCOUNT_CD] и [ACCOUNT_CD_HIGH] amp; «*» и для другого поля те же самые вещи в сочетании друг с другом, и ни один из них не будет генерировать данные вместе
Также пробовал: Нравится [Forms]![ValidationForm1_3]![AccountCMBO] amp; «» И между [ACCOUNT_CD] И [ACCOUNT_CD_HIGH] с тем же самым в другом поле формы: Нравится [Forms]![ValidationForm1_3]![FunctionR3CMBO] amp; «» И между [OP_TYP] И [OP_TYP_HIGH]
А также попытался поместить «Или» между ними вместо «И»
Кто-нибудь знает, как я могу это исправить?
Мой фактический Access SQL:
SELECT VALIDATION_RULE3.ACCOUNT_CD, VALIDATION_RULE3.ACCOUNT_CD_HIGH,
Rule3_Accounts.Description, Rule3_Accounts.D0_DESCA, Rule3_Accounts.D0_TYPE,
Rule3_Accounts.D0_PARENT, Rule3_Accounts.D0_WEIGHT, Rule3_Accounts.D0_LEVEL,
Rule3_Accounts.D0_CHILD, Rule3_Accounts.D0_PRIORITY, Rule3_Accounts.D0_STATUS,
Rule3_Accounts.D0_CHILDSORT, Rule3_Accounts.D0_CREATE, Rule3_Accounts.D0_MODIFY,
Rule3_Accounts.D0_BALTYPE, Rule3_Accounts.AccountText, VALIDATION_RULE3.XPN_OP_TYP_CD
FROM Rule3_Accounts INNER JOIN O8_VALIDATION_RULE3 ON Rule3_Accounts.AccountText = O8_VALIDATION_RULE3.ACCOUNT_CD
WHERE ((([Forms]![ValidationForm1_3]![AccountCMBO]) Like [Forms]![ValidationForm1_3]![AccountCMBO] amp; "*" Or ([Forms]![ValidationForm1_3]![AccountCMBO]) Between [ACCOUNT_CD] And [ACCOUNT_CD_HIGH] amp; "*")
AND (([Forms]![ValidationForm1_3]![FunctionR3CMBO]) Like
[Forms]![ValidationForm1_3]![FunctionR3CMBO] amp; "*"
Or ([Forms]![ValidationForm1_3]![FunctionR3CMBO]) Between [XPN_OP_TYP_CD] And [XPN_OP_TYP_CD_HIGH] amp; "*"));
Ответ №1:
Мне кажется, вам нужно проверить, является ли параметр пустым или нет.
Where (isnull(@account_cd) or field1 >= @account_cd)
and (isnull(@account_cd_high) or field1 <= @account_cd_high)
Это вернет значение true, если в параметрах оставлено значение null (возможно, вам потребуется сделать @account_cd = ''
вместо этого, в зависимости от того, как написан ваш код). Затем, если параметры не равны null, то любой столбец, с которым вы их сравниваете, должен быть сверен со значением. Поскольку вы не знаете, будут ли предоставлены оба значения или только одно, between просто не будет работать для вас.
Кроме того, sql замыкается, поэтому, если значения ваших параметров равны null, вторая часть or
не будет проверяться. Вот почему чрезвычайно важно сначала выполнить проверку null при возникновении проблем такого типа.
Комментарии:
1. Вот мой Access SQL на данный момент: ГДЕ ((([Формы]! [ValidationForm1_3]! [AccountCMBO]) Нравится [Forms]! [ValidationForm1_3]! [AccountCMBO] amp; » » Или ([Формы]! [ValidationForm1_3]! [AccountCMBO]) Между [ACCOUNT_CD] И [ACCOUNT_CD_HIGH] amp; » «) И (([Формы]! [ValidationForm1_3]! [FunctionR3CMBO]) Нравится [Forms]! [ValidationForm1_3]! [FunctionR3CMBO] amp; » » Или ([Формы]! [ValidationForm1_3]! [FunctionR3CMBO]) Между [XPN_OP_TYP_CD] И [XPN_OP_TYP_CD_HIGH] amp; » «)); Также я сделал так, чтобы каждое поле в форме было «» вместо null в форме, что делает его похожим на [Forms]! [BackUpValidationForm1_3]! [AccountCMBO] и «*» работают
2. Но теперь мне нужно, чтобы он продолжал работать, даже если поле пустое, а также находил записи, которые также находятся между столбцами low и high
3. @user3456880 Я не думаю, что то, что вы написали, и то, что написал я, — это одно и то же, но, честно говоря, я не могу сказать, потому что ваш код чрезвычайно сложен для чтения. Было бы полезно, если бы вы включили весь запрос вместо только предложений where и отформатировали его как блок кода. Я полагаю, что sql, который я ввел в своем ответе, будет работать, если поле пустое, и найдет указанные записи.
4. Я попытался немного почистить код. Я не думаю, что то, о чем вы изначально говорили, помогло бы в этой ситуации. В текстовых полях в форме у меня есть значение по умолчанию в виде двух двойных кавычек, подобных этому «», чтобы он не искал значения null, и в этих базах данных нет значений null в них. Мне это нужно, чтобы позволить мне сохранить поле пустым в форме, что я изначально исправил, выполнив подобное [Forms]! [BackUpValidationForm1_3]! [AccountCMBO] amp; «*» но теперь мне нужно, чтобы он продолжал это делать, а также просматривал столбцы low и high, чтобы увидеть, находится ли он между этими числами, если это так, включите его также