powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / ASCAN в теле SQL
6 сообщений из 6, страница 1 из 1
ASCAN в теле SQL
    #37488412
Alex_it_bel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть:

Считывая в массив 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 (как впринципе и должно быть)

Если кто сталкивался, поясните плиз в чём ошибка?
...
Рейтинг: 0 / 0
ASCAN в теле SQL
    #37488432
Alex_it_bel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_it_belПроблема: Допустим в массив считались следующие данные: arMnemo("Волга","Мисис","Ока") (3 элемента)
и допустим у нас Поле Mnemo в таблице Nation равно "Мисисипи". По идее эта запись не должна попасть в выборку, но она ПО НЕПОНЯТНОЙ МНЕ ПРИЧИНЕ туда попадает, т.е. ASCAN(arMnem, ALLTRIM(Nation.Mnemo)) = 0; - это условие не срабатывает!!!


Извиняюсь, немного неправильно написал:

Запись ДОЛЖНА попасть в выборку, потому что условие "ASCAN(arMnem, ALLTRIM(Nation.Mnemo)) = 0" должно сработать (Так как "Мисисипи" не равняется ни одному из элементов массива), но запись НЕ ПОПАДАЕТ в выборку (видимо, потому что она считает равными "Мисис" и "Мисисипи")
...
Рейтинг: 0 / 0
ASCAN в теле SQL
    #37488481
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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'
...
Рейтинг: 0 / 0
ASCAN в теле SQL
    #37488579
Alex_it_bel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG,

Сделал SET ANSI ON и всё заработало как надо.

Только немного всётаки неясно почему команда SET EXACT ON не работает. Можно чуть-чуть по подробнее?

Команда SET EXACT ON, на скока я понял, при сравнении строк дополняет короткое слово пробелами и потом сравнивает по символьно.

Но из вашей строки
авторПримечание:
В OLE DB провайдере Visual FoxPro, Вы не можете использовать в запросах величины в формате ANSI
я так понял, что при выборке не происходит дополнения строки пробелами и идёт сравнение по короткому слову.

Мои мысли верны?)
...
Рейтинг: 0 / 0
ASCAN в теле SQL
    #37488840
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_it_bel,

В отличие от команды SET ANSI, команда SET EXACT не работает в операторах SQL системы Visual FoxPro SQL. Для дополнительной информации см.
...
Рейтинг: 0 / 0
ASCAN в теле SQL
    #37490046
Alex_it_bel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG,

Спасибо за помощь!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / ASCAN в теле SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]