|
ASCAN в теле SQL
|
|||
---|---|---|---|
#18+
Суть: Считывая в массив arMnemo необходимые мне данные с Excel LOCAL nreccount, i i = 1 DO WHILE !(ISNULL(xlsh.cells(i,1).value)) i = i + 1 ENDDO nreccount = i - 1 FOR i = 1 TO nreccount temp1 = xlsh.cells(i,1).value temp1 = Iif(Type('temp1')='N',Allt(str(temp1)),Allt(temp1)) DIMENSION arMnem(i) arMnem(i) = temp1 ENDFOR Далее делаю настройку, что 2 символьных выражения будут равны, только в том случае, если 2 выражения совпадут посимвольно (и символы и длина должны быть одинаковыми). И собственна сама выборка, в которой есть условие "ASCAN(arMnem, ALLTRIM(Nation.Mnemo)) = 0;", т.е. в выборку должны попасть только те записи, в которых поле Mnemo таблицы Nation не совпало ни с одной из записей в массиве. SET EXACT ON SELECT NVL(Nation.Mnemo, SPACE(15)) as Mnemo,; NVL(Person.orbase_rn, SPACE(15)) as orbase_rn,; NVL(accbook.num, SPACE(4)) as acc_num,; NVL(faceacce.num, SPACE(240)) as num,; NVL(faceacce.arch_date, {}) as arch_date,; NVL(faceacce.date_close, {}) as date_close; FROM Accbook; INNER JOIN Faceacce ON Accbook.rn = faceacce.book_rn; INNER JOIN Hozmemb ON Faceacce.rn = Hozmemb.FACEACC_RN; INNER JOIN Person ON Hozmemb.orbase_rn = Person.orbase_rn; INNER JOIN Nation ON Person.Nation_rn = Nation.rn AND ASCAN(arMnem, ALLTRIM(Nation.Mnemo)) = 0; WHERE ASCAN(aRn, Accbook.rn)#0; INTO CURSOR crsData READWRITE SELECT * from crsData compos = 'Национальности' Проблема: Допустим в массив считались следующие данные: arMnemo("Волга","Мисис","Ока") (3 элемента) и допустим у нас Поле Mnemo в таблице Nation равно "Мисисипи". По идее эта запись не должна попасть в выборку, но она ПО НЕПОНЯТНОЙ МНЕ ПРИЧИНЕ туда попадает, т.е. ASCAN(arMnem, ALLTRIM(Nation.Mnemo)) = 0; - это условие не срабатывает!!! При этом если записать Messagebox(ASCAN(arMnem, "Мисисипи")), выдаёт значение 0 (как впринципе и должно быть) Если кто сталкивался, поясните плиз в чём ошибка? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2011, 11:24 |
|
ASCAN в теле SQL
|
|||
---|---|---|---|
#18+
Alex_it_belПроблема: Допустим в массив считались следующие данные: arMnemo("Волга","Мисис","Ока") (3 элемента) и допустим у нас Поле Mnemo в таблице Nation равно "Мисисипи". По идее эта запись не должна попасть в выборку, но она ПО НЕПОНЯТНОЙ МНЕ ПРИЧИНЕ туда попадает, т.е. ASCAN(arMnem, ALLTRIM(Nation.Mnemo)) = 0; - это условие не срабатывает!!! Извиняюсь, немного неправильно написал: Запись ДОЛЖНА попасть в выборку, потому что условие "ASCAN(arMnem, ALLTRIM(Nation.Mnemo)) = 0" должно сработать (Так как "Мисисипи" не равняется ни одному из элементов массива), но запись НЕ ПОПАДАЕТ в выборку (видимо, потому что она считает равными "Мисис" и "Мисисипи") ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2011, 11:32 |
|
ASCAN в теле SQL
|
|||
---|---|---|---|
#18+
Alex_it_bel, Specifies whether to pad a shorter string with spaces when making a SQL string comparison or binary expression with zero (0) bytes when making a binary expression comparison in SQL commands using the equal sign operator (=). Примечание: В OLE DB провайдере Visual FoxPro, Вы не можете использовать в запросах величины в формате ANSI , однако команда SET ANSI поддерживается. SET ANSI ON | OFF Параметры ON Короткие символьные строки дополняются справа пробелами или нуль-символами (0) для уравнивания их с более длинными символьными строками или выражениями. Когда SET ANSI установлено в ON, обе сравниваемые символьные строки должны иметь одинаковую длину. OFF (По-умолчанию) Определяет, что короткие символьные строки не дополняются справа пробелами или нуль-символами (0) в целях уравнивания длин сравниваемых строк. Когда SET ANSI установлено в OFF, две символьные строки сравниваются символ за символом по достижению конца короткой строки. Комментарии Команда SET ANSI не эффективна при указании "двойного" сравнивания, оператор (= =). Когда Вы указываете данный оператор сравнения = = , короткая строка всегда дополняется справа пробелами или нуль-символом (до длины большей строки). Для дополнительной информации см. раздел Реляционные операторы. Команда SET ANSI действует только в текущей рабочей сессии. SET ANSI и Дизайнер Запросов Visual FoxPro выстраивают команды SELECT - SQL в Дизайнере Запросов . При использовании Вами конструкций Join и Filter, для операторов сравнения Equal или Exactly Like , используются соответствующие операторы = или = = в командах SELECT-SQL. Соответствующая установка Команды SET ANSI может повлиять на результат выполнения запроса. Порядок строк. В командах SELECT-SQL порядок строк при сортировке не зависит от использования указанных операторов сравнения: = или = = . Пример В следующем примере, когда SET ANSI установлено в ON, результатом будет False (.F.), потому , что при уравнивании строк до одинаковой длины их значения остаются различными: Копировать Код 'Tommy' = 'Tom' Опрератор = = (двойного сравнения) используется в SELECT-SQL командах. В следующем примере, когда SET ANSI установлено в ON, результатом будет True (.T.), потому, что сравнение завершается на 'Tom': Копировать Код 'Tommy' = 'Tom' ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2011, 11:52 |
|
ASCAN в теле SQL
|
|||
---|---|---|---|
#18+
IgorNG, Сделал SET ANSI ON и всё заработало как надо. Только немного всётаки неясно почему команда SET EXACT ON не работает. Можно чуть-чуть по подробнее? Команда SET EXACT ON, на скока я понял, при сравнении строк дополняет короткое слово пробелами и потом сравнивает по символьно. Но из вашей строки авторПримечание: В OLE DB провайдере Visual FoxPro, Вы не можете использовать в запросах величины в формате ANSI я так понял, что при выборке не происходит дополнения строки пробелами и идёт сравнение по короткому слову. Мои мысли верны?) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2011, 12:33 |
|
ASCAN в теле SQL
|
|||
---|---|---|---|
#18+
Alex_it_bel, В отличие от команды SET ANSI, команда SET EXACT не работает в операторах SQL системы Visual FoxPro SQL. Для дополнительной информации см. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2011, 13:50 |
|
|
start [/forum/topic.php?fid=41&fpage=67&tid=1584061]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 265ms |
total: | 405ms |
0 / 0 |