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

ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

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

Сообщение 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 в любом месте?

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

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

Заранее спасибо!
Последний раз редактировалось Developer 09 Ноябрь 2014, 1:51, всего редактировалось 1 раз.
С Уважением, Developer
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

Сообщение Дед Пахом »

В хелпе поищите TURBOSQL, это то что Вам нужно. Вкратце: объявляете файл с опцией драйвера /TURBOSQL, OPEN(Table); Table{prop:sql} = 'SELECT Sum(Arrival) FROM DATABASE'; NEXT(Table) - в буфере Table результат запроса.
С уважением, ДП
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

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

Сообщение 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 запросе!


Ещё раз ОГРОМНОЕ Спасибо!
Последний раз редактировалось Developer 08 Ноябрь 2014, 23:10, всего редактировалось 2 раза.
С Уважением, Developer
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

Сообщение Дед Пахом »

1. Результат запроса помещается в поля RECORD по порядку: первая колонка в Variable1, вторая в variable2 и т.д.
2. Не совсем понял вопрос. Точнее совсем не понял.
С уважением, ДП
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

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

Сообщение Developer »

Дед Пахом большое спасибо за столь оперативные ответы!

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

3)Один из существенных вопросов - использование переменных Clarion в SQL запросе {PROP:SQL}? Может есть хороший пример?
С Уважением, Developer
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

Сообщение Дед Пахом »

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

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

Сообщение 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 запросе?
С Уважением, Developer
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

Сообщение Дед Пахом »

строковые константы надо обрамлять двойным апострофом: '... AND UserName = '''& UserNameInput&''')'; как написано у Вас в SQL попадает в виде AND UserName = Имя1 (без апострофов)
С уважением, ДП
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

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

Сообщение 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. Трудно понять где апостраф ' а где машинописная двойная кавычка " если они рядом.
С Уважением, Developer
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

Сообщение Дед Пахом »

никаких двойных кавычек, только одинарные, но две подряд, и надо ещё про CLIP() помнить:
'SELECT * FROM DATABASE WHERE UserName = ''' & CLIP(LOC:UserNameInput) &'''' -- здесь один апостроф перед SELECT, 3 после = и 4 в конце.
С уважением, ДП
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

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

Сообщение Developer »

Дед Пахом БОЛЬШОЕ СПАСИБО за оперативные ответы!

TurboSQLTable {PROP:SQL} = 'SELECT * FROM DATABASE WHERE UserName = ''' & CLIP(UserNameInput) &'''' отлично работает!
С Уважением, Developer
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

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

Сообщение Admin »

Используйте в качестве переменных для подстановки CSTRING, в этом случае не нужен CLIP и можно слово с пробелом в конце ввести, что иногда нужно.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

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

Сообщение Алексей- Софт-Центр »

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

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

Алексей
Ал
✯ Ветеран ✯
Сообщения: 1011
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия

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

Сообщение Ал »

Developer писал(а): P.S. Трудно понять где апостраф ' а где машинописная двойная кавычка " если они рядом.
если "слеповато" - используй & chr(...) & - будет понятнее где и что
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение 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)
Последние два параметра необязательны, если их не указывать - используются первое и второе поля очереди

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