Нативный код SQL в Clarion
Модератор: Andrew™
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Нативный код SQL в Clarion
Привет всем!
Подскажите пожалуйста, как возможно использовать нативный код 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 в любом месте?
Подскажите, пожалуйста советом и примером.
Если есть какие либо исходники, шаблоны, и документация по данной теме очень прошу выслать в личные сообщения.
Заранее спасибо!
Подскажите пожалуйста, как возможно использовать нативный код 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
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
Re: Нативный код SQL в Clarion
В хелпе поищите TURBOSQL, это то что Вам нужно. Вкратце: объявляете файл с опцией драйвера /TURBOSQL, OPEN(Table); Table{prop:sql} = 'SELECT Sum(Arrival) FROM DATABASE'; NEXT(Table) - в буфере Table результат запроса.
С уважением, ДП
Re: Нативный код SQL в Clarion
Дед Пахом ОГРОМНОЕ Спасибо!
Получил результат обработки 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 запросе!
Ещё раз ОГРОМНОЕ Спасибо!
Получил результат обработки 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
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
Re: Нативный код SQL в Clarion
1. Результат запроса помещается в поля RECORD по порядку: первая колонка в Variable1, вторая в variable2 и т.д.
2. Не совсем понял вопрос. Точнее совсем не понял.
2. Не совсем понял вопрос. Точнее совсем не понял.
С уважением, ДП
Re: Нативный код SQL в Clarion
Дед Пахом большое спасибо за столь оперативные ответы!
2)Имел ввиду как поместить ответы сервера на SQL запросы в другую существующую таблицу?
3)Один из существенных вопросов - использование переменных Clarion в SQL запросе {PROP:SQL}? Может есть хороший пример?
2)Имел ввиду как поместить ответы сервера на SQL запросы в другую существующую таблицу?
3)Один из существенных вопросов - использование переменных Clarion в SQL запросе {PROP:SQL}? Может есть хороший пример?
С Уважением, Developer
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
Re: Нативный код SQL в Clarion
2. То есть вариант "INSERT INTO Table SELECT ... FROM ..." Вас почему-то не устраивает? Тогда обычный Clarion способ: цикл по TurboTable и запись в нужную таблицу.
3. Могу только посоветовать очевидную вещь: типа 'SELECT * FROM '& Table{Prop:Name} &' WHERE Id = '& loc:id
3. Могу только посоветовать очевидную вещь: типа 'SELECT * FROM '& Table{Prop:Name} &' WHERE Id = '& loc:id
С уважением, ДП
Re: Нативный код SQL в Clarion
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 запросе?
В Clarion
UserNameInput = 'Имя1'
TurboSQLTable {PROP:SQL} = 'SELECT * FROM DATABASE WHERE (Arrival <> 0 AND UserName = '& UserNameInput&')' Не работает!
Исправь пожалуйста ошибку в этом запросе.
Как правильно указывать (оформлять) локальную переменную UserNameInput в SQL запросе?
С Уважением, Developer
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
Re: Нативный код SQL в Clarion
строковые константы надо обрамлять двойным апострофом: '... AND UserName = '''& UserNameInput&''')'; как написано у Вас в SQL попадает в виде AND UserName = Имя1 (без апострофов)
С уважением, ДП
Re: Нативный код SQL в Clarion
TurboSQLTable {PROP:SQL} = 'SELECT * FROM DATABASE WHERE UserName = ''Имя1'' '! Работает! Строка работает без проблем
TurboSQLTable {PROP:SQL} = 'SELECT * FROM DATABASE WHERE UserName = "'&LOC:UserNameInput&'"' ! Не работает! Переменная не работает!
Оформи пожалуйста переменную LOC:UserNameInput чтобы я мог её скопировать в текст Clarion
P.S. Трудно понять где апостраф ' а где машинописная двойная кавычка " если они рядом.
TurboSQLTable {PROP:SQL} = 'SELECT * FROM DATABASE WHERE UserName = "'&LOC:UserNameInput&'"' ! Не работает! Переменная не работает!
Оформи пожалуйста переменную LOC:UserNameInput чтобы я мог её скопировать в текст Clarion
P.S. Трудно понять где апостраф ' а где машинописная двойная кавычка " если они рядом.
С Уважением, Developer
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
Re: Нативный код SQL в Clarion
никаких двойных кавычек, только одинарные, но две подряд, и надо ещё про CLIP() помнить:
'SELECT * FROM DATABASE WHERE UserName = ''' & CLIP(LOC:UserNameInput) &'''' -- здесь один апостроф перед SELECT, 3 после = и 4 в конце.
'SELECT * FROM DATABASE WHERE UserName = ''' & CLIP(LOC:UserNameInput) &'''' -- здесь один апостроф перед SELECT, 3 после = и 4 в конце.
С уважением, ДП
Re: Нативный код SQL в Clarion
Дед Пахом БОЛЬШОЕ СПАСИБО за оперативные ответы!
TurboSQLTable {PROP:SQL} = 'SELECT * FROM DATABASE WHERE UserName = ''' & CLIP(UserNameInput) &'''' отлично работает!
TurboSQLTable {PROP:SQL} = 'SELECT * FROM DATABASE WHERE UserName = ''' & CLIP(UserNameInput) &'''' отлично работает!
С Уважением, Developer
- Admin
- Администратор
- Сообщения: 3963
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 29 раз
- Поблагодарили: 22 раза
- Контактная информация:
Re: Нативный код SQL в Clarion
Используйте в качестве переменных для подстановки CSTRING, в этом случае не нужен CLIP и можно слово с пробелом в конце ввести, что иногда нужно.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
-
- Ветеран
- Сообщения: 390
- Зарегистрирован: 26 Август 2009, 12:41
- Откуда: Moscow
- Контактная информация:
Re: Нативный код SQL в Clarion
Добрый день!
я обычно использую справа переменную, а не константу.
TurboSQLTable {PROP:SQL} = clip(s1)
Это позволяет отследить конкретно формат полученного оператора sql на этапе аыполнения
с помощью stop(s1)
На Многие Ваши вопросы Вы бы получили ответ сами.
Алексей
я обычно использую справа переменную, а не константу.
TurboSQLTable {PROP:SQL} = clip(s1)
Это позволяет отследить конкретно формат полученного оператора sql на этапе аыполнения
с помощью stop(s1)
На Многие Ваши вопросы Вы бы получили ответ сами.
Алексей
-
- ✯ Ветеран ✯
- Сообщения: 1014
- Зарегистрирован: 08 Июль 2005, 6:48
- Откуда: Россия
- Поблагодарили: 1 раз
Re: Нативный код SQL в Clarion
если "слеповато" - используй & chr(...) & - будет понятнее где и чтоDeveloper писал(а): P.S. Трудно понять где апостраф ' а где машинописная двойная кавычка " если они рядом.
Re: Нативный код SQL в Clarion
Я использовал примерно такую схему:
В базе данных создаётся таблица с ровно одним строковым полем. Внутри процедуры можно это поле использовать как сразу несколько полей
...
Дальше была написана процедура LoadQueueFromSQL( с некоторыми небольшими различиями для CW5 и CW6, MS SQL и Oracle ).
И работа с БД шла примерно так
Если запрос имеет вид списка, то объявляем очередь,куда писать результаты
И читаем...
LoadQueueFromSQL('Select Name,Sum(x) where ... group by name order by name', ResultQueue, RQ:Name, RQ:Sum)
Последние два параметра необязательны, если их не указывать - используются первое и второе поля очереди
Собственно, не очень эффективная, но крайне экономичная метода.
В базе данных создаётся таблица с ровно одним строковым полем. Внутри процедуры можно это поле использовать как сразу несколько полей
Код: Выделить всё
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)
Последние два параметра необязательны, если их не указывать - используются первое и второе поля очереди
Собственно, не очень эффективная, но крайне экономичная метода.