Страница 1 из 3

Нативный код SQL в Clarion

Добавлено: 08 Ноябрь 2014, 19:55
Developer
Привет всем!

Подскажите пожалуйста, как возможно использовать нативный код SQL в Clarion?

К примеру, необходимо вычислить сумму всех значений в базе данных SQL сервера
поля Arrival в таблице DATABASE
и присвоить значение в переменную в исходнике программы на Clarion.

Нативный код SQL -> SELECT Sum(Arrival) FROM DATABASE

В среде Sybase ASA Interactive SQL и Microsoft SQL Management Studio данный запрос вычисляет
сумму и отображает результат.

Из документации по Clarion обнаружил что использовать код SQL возможно только в структуре VIEW.

Но вот как конкретно использовать никак не разберусь :(

Есть ли какая возможность использовать нативный код SQL без использования структуры VIEW в исполняемом коде Clarion в любом месте?

Подскажите, пожалуйста советом и примером.

Если есть какие либо исходники, шаблоны, и документация по данной теме очень прошу выслать в личные сообщения.

Заранее спасибо!

Re: Нативный код SQL в Clarion

Добавлено: 08 Ноябрь 2014, 20:19
Дед Пахом
В хелпе поищите TURBOSQL, это то что Вам нужно. Вкратце: объявляете файл с опцией драйвера /TURBOSQL, OPEN(Table); Table{prop:sql} = 'SELECT Sum(Arrival) FROM DATABASE'; NEXT(Table) - в буфере Table результат запроса.

Re: Нативный код SQL в Clarion

Добавлено: 08 Ноябрь 2014, 22:00
Developer
Дед Пахом ОГРОМНОЕ Спасибо!

Получил результат обработки SQL запроса!

Сейчас разбираюсь дальше...

Есть новые вопросы:

1)Возможно ли результат запроса поместить в определённые конкретные переменные структуры RECORD?
И если да, то как правильно сформировать запрос?

2)Возможно ли результат запроса поместить в новую таблицу?

3)Как правильно сформировать SQL запрос с переменной Clarion?

Database FILE,DRIVER('SQLAnywhere'),OWNER('SybaseASASQLDatabase,DBA,sql'),PRE(Use),BINDABLE,CREATE,THREAD !
KeyUserRecordID KEY(Use:UserRecordID),NOCASE,PRIMARY !
KeyUserNumber KEY(Use:UserNumber),DUP,NOCASE !
KeyUserCode KEY(Use:UserCode),DUP,NOCASE !
KeyUserName KEY(Use:UserName),DUP,NOCASE !
Record RECORD,PRE()
UserRecordID LONG !
UserNumber STRING(20) !
UserCode STRING(20) !
UserName STRING(20) !Пользователь
Arrival DECIMAL(7,2) !Приход
Expense DECIMAL(7,2) !Расход
Rest DECIMAL(7,2) !Остаток
END
END

TurboSQLTable FILE,DRIVER('SQLAnywhere'','/TURBOSQL=True'), PRE(Turbo)
Record RECORD
Variable1 DECIMAL(7,2)
Variable2 DECIMAL(7,2)
Variable3 DECIMAL(7,2)
DailyDT CSTRING(25)
DailyDTGroup GROUP,OVER(DailyDT)
DailyDTDate DATE
DailyDTTime TIME
END
END
END

UserNameInput STRING(20) Переменная Clarion

CODE

UserNameInput = 'Имя1'

TurboSQLTable {PROP:SQL} = 'SELECT Sum(Arrival) FROM DATABASE WHERE (Arrival <> 0 AND UserName = "UserNameInput")' ->Ошибка в SQL запросе!


Ещё раз ОГРОМНОЕ Спасибо!

Re: Нативный код SQL в Clarion

Добавлено: 08 Ноябрь 2014, 22:47
Дед Пахом
1. Результат запроса помещается в поля RECORD по порядку: первая колонка в Variable1, вторая в variable2 и т.д.
2. Не совсем понял вопрос. Точнее совсем не понял.

Re: Нативный код SQL в Clarion

Добавлено: 08 Ноябрь 2014, 23:29
Developer
Дед Пахом большое спасибо за столь оперативные ответы!

2)Имел ввиду как поместить ответы сервера на SQL запросы в другую существующую таблицу?

3)Один из существенных вопросов - использование переменных Clarion в SQL запросе {PROP:SQL}? Может есть хороший пример?

Re: Нативный код SQL в Clarion

Добавлено: 09 Ноябрь 2014, 0:31
Дед Пахом
2. То есть вариант "INSERT INTO Table SELECT ... FROM ..." Вас почему-то не устраивает? Тогда обычный Clarion способ: цикл по TurboTable и запись в нужную таблицу.
3. Могу только посоветовать очевидную вещь: типа 'SELECT * FROM '& Table{Prop:Name} &' WHERE Id = '& loc:id

Re: Нативный код SQL в Clarion

Добавлено: 09 Ноябрь 2014, 0:49
Developer
SELECT Sum(Arrival) FROM DATABASE WHERE (Arrival <> 0 AND UserName = 'Имя1') - работает в Sybase ASA Interactive SQL и Microsoft SQL Management Studio

В Clarion
UserNameInput = 'Имя1'
TurboSQLTable {PROP:SQL} = 'SELECT * FROM DATABASE WHERE (Arrival <> 0 AND UserName = '& UserNameInput&')' Не работает!

Исправь пожалуйста ошибку в этом запросе.

Как правильно указывать (оформлять) локальную переменную UserNameInput в SQL запросе?

Re: Нативный код SQL в Clarion

Добавлено: 09 Ноябрь 2014, 1:24
Дед Пахом
строковые константы надо обрамлять двойным апострофом: '... AND UserName = '''& UserNameInput&''')'; как написано у Вас в SQL попадает в виде AND UserName = Имя1 (без апострофов)

Re: Нативный код SQL в Clarion

Добавлено: 09 Ноябрь 2014, 1:44
Developer
TurboSQLTable {PROP:SQL} = 'SELECT * FROM DATABASE WHERE UserName = ''Имя1'' '! Работает! Строка работает без проблем

TurboSQLTable {PROP:SQL} = 'SELECT * FROM DATABASE WHERE UserName = "'&LOC:UserNameInput&'"' ! Не работает! Переменная не работает!

Оформи пожалуйста переменную LOC:UserNameInput чтобы я мог её скопировать в текст Clarion

P.S. Трудно понять где апостраф ' а где машинописная двойная кавычка " если они рядом.

Re: Нативный код SQL в Clarion

Добавлено: 09 Ноябрь 2014, 2:32
Дед Пахом
никаких двойных кавычек, только одинарные, но две подряд, и надо ещё про CLIP() помнить:
'SELECT * FROM DATABASE WHERE UserName = ''' & CLIP(LOC:UserNameInput) &'''' -- здесь один апостроф перед SELECT, 3 после = и 4 в конце.

Re: Нативный код SQL в Clarion

Добавлено: 09 Ноябрь 2014, 5:00
Developer
Дед Пахом БОЛЬШОЕ СПАСИБО за оперативные ответы!

TurboSQLTable {PROP:SQL} = 'SELECT * FROM DATABASE WHERE UserName = ''' & CLIP(UserNameInput) &'''' отлично работает!

Re: Нативный код SQL в Clarion

Добавлено: 09 Ноябрь 2014, 5:35
Admin
Используйте в качестве переменных для подстановки CSTRING, в этом случае не нужен CLIP и можно слово с пробелом в конце ввести, что иногда нужно.

Re: Нативный код SQL в Clarion

Добавлено: 09 Ноябрь 2014, 10:56
Алексей- Софт-Центр
Добрый день!
я обычно использую справа переменную, а не константу.
TurboSQLTable {PROP:SQL} = clip(s1)
Это позволяет отследить конкретно формат полученного оператора sql на этапе аыполнения
с помощью stop(s1)

На Многие Ваши вопросы Вы бы получили ответ сами.

Алексей

Re: Нативный код SQL в Clarion

Добавлено: 09 Ноябрь 2014, 22:41
Ал
Developer писал(а): P.S. Трудно понять где апостраф ' а где машинописная двойная кавычка " если они рядом.
если "слеповато" - используй & chr(...) & - будет понятнее где и что

Re: Нативный код SQL в Clarion

Добавлено: 10 Ноябрь 2014, 1:39
Yufil
Я использовал примерно такую схему:
В базе данных создаётся таблица с ровно одним строковым полем. Внутри процедуры можно это поле использовать как сразу несколько полей

Код: Выделить всё

Field1   Cstring(25),Name('DummyField')
Field2   Cstring(200),Name('DummyField')
Field3   Long,Name('DummyField') 
...
Дальше была написана процедура LoadQueueFromSQL( с некоторыми небольшими различиями для CW5 и CW6, MS SQL и Oracle ).
И работа с БД шла примерно так

Код: Выделить всё

Result    Real 
Result1  Long
Result2  Long 
Result3  Long 

LoadQueueFromSQL('Select sum(x)..where...',,result) 
LoadQueueFromSQL('Select sum(x),sum(y),sum(z) from ... where ....',, result1, result2, result3) 
Если запрос имеет вид списка, то объявляем очередь,куда писать результаты

Код: Выделить всё

ResultQueue  Queue,Pre(RQ) 
Name            Cstring(30)
Sum              Long
                    End
И читаем...
LoadQueueFromSQL('Select Name,Sum(x) where ... group by name order by name', ResultQueue, RQ:Name, RQ:Sum)
Последние два параметра необязательны, если их не указывать - используются первое и второе поля очереди

Собственно, не очень эффективная, но крайне экономичная метода.