Александр Агеев
alexande...@gmail.com
ICQ 360029563
скайп
alexander.n.ageev
From: cla...@googlegroups.com [mailto:cla...@googlegroups.com] On Behalf Of IgLowy
Sent: Friday, December 12, 2014 12:04 AM
To: cla...@googlegroups.com
Subject: {ClaList:7883} Вызов хранимой процедуры MS SQL с параметрами
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Декларацию (достаточно прототип) хранимки на T-SQL в студию.
WBR, Nikolay Tsigouro
Настройки подписки и доставки писем: https://groups.google.com/d/optout.
| Декларацию (достаточно прототип) хранимки на T-SQL в студию. WBR, Nikolay Tsigouro 15.12.2014 9:39 пользователь "IgLowy" <igl...@mail.ru> написал: Ну вот у меня есть сомнения как раз насчёт параметров. я упомянул, что там передаётся список операций. по словам разработчика это какой-то список в памяти, как я понимаю, аналогичный кларионовскому queue. и ещё есть сомнение касаемое возвращаемого значения. раньше получить его из хранимки было можно только через запись в таблицу. изменилось ли что-то в этом плане? пятница, 12 декабря 2014 г., 18:15:08 UTC+4 пользователь Alexander Ageev написал: Привет! Да, можно. Реализация зависит от типа передаваемых параметров В простейшем случае - {Prop:sql} рулит Александр Агеев alexande...@gmail.com ICQ 360029563 скайп alexander.n.ageev |
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Что-то у тебя мало закавыченных параметров...
По хорошему, даты лучше вводить через CONVERT или CAST, чтобы работало не зависимо от дефолтного формата дат. И вообще, подстановка строки там, где хранимка ожидает дату скорее всего не прокатит.
Т. е. в клаше форматируешь дату в один из скульных форматов, а в вызове хранимки превращаешь эту строку в дату.
Чтобы не мучиться через клашу, перенеси через клипборд свой оператор в обычный скульный клиент и добился, чтобы заработал. А потом перенесешь в клашу.
26 Мар 2015 г. 17:32 пользователь "IgLowy" <igl...@mail.ru> написал:
>
> Возвращаюсь к своему старому вопросу
>
>
> Окончательную версию программы нам прислали только в конце февраля. На этой неделе взялся за разработку своего варианта программы.
> пробовал для начала сделать свою простенькую хранимку - работает. потом стал вызывать нужную мне хранимку - не вызывается.
> делаю вызов хранимки и получаю ошибку.
> это фрагмент лога:
>
> 013F8H(1) 18:35:07.783 Executing Statement 0532830H:CALL sp_stoim('690111',1, ,1,ВВВВВВВВ,ВВВВВВВВ,ВВВВВВВВ,1,2015-01-01,031,1,1,,K35.8,K35.8,K35.8,1,1,2015-01-01,2015-01-01,0,,,0,2,)
> 013F8H(1) 18:35:07.798 Error Occurred: 37000 [Microsoft][ODBC SQL Server Driver][SQL Server]Неправильный синтаксис около конструкции "690111".
> 013F8H(1) 18:35:07.798 Time Taken:0.02 secs
> 013F8H(1) 18:35:07.798 SET_PROPERTY(dbo.sluch:016A030H) Неправильный синтаксис около конструкции "690111". Time Taken:0.02 secs
>
> на какую ошибку может указывать такое сообщение?
> часть параметров у меня заменены пока на более простые типы, какие-то типы я мог указать неправильно, вместо списков пока использую пустые строки. может ли это приводить к ошибке?
Легко. Я думаю, что вместо пустых списков нужно NULL передавать, а никак не строки. Список и строка - существенно разные типы, и про автоматическое клашино преобразование типов забудь! Все преобразования типов только явно.
А вообще-то, тебе давали ссылку, как списки формировать и передавать. RTFM что говорит?
Как ты их объявил, по большому счету, до фонаря. Это не поля таблиц. Важно, как ты из них скульный оператор сформируешь.
Рекомендую для передачи строк написать (в клаше) форматирующую функцию, которая задвоит кавычки и обработает прочие спецсимволы.
Что-то у тебя мало закавыченных параметров...
По хорошему, даты лучше вводить через CONVERT или CAST, чтобы работало не зависимо от дефолтного формата дат. И вообще, подстановка строки там, где хранимка ожидает дату скорее всего не прокатит.
Т. е. в клаше форматируешь дату в один из скульных форматов, а в вызове хранимки превращаешь эту строку в дату.
Чтобы не мучиться через клашу, перенеси через клипборд свой оператор в обычный скульный клиент и добился, чтобы заработал. А потом перенесешь в клашу.
| Надо EXEC вместо CALL Римас |
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
--
| Ну я надеялся что ты погуглишь насчет EXEC :) Попробуй убрать скобки. И да, дату лучше форматировать @d12. Когда я делаю подобные вещи, то сначала пробую сформатированный Кларионом SQL запрос выполнить в SQL менеджере: SETCLIPBOARD(Loc:SQLExp) MESSAGE('Query in Clipboard') Я пользуюсь dbForge Studio for SQL Server - бесплатный и сразу показывает ошибки в синтаксисе Rimas |
--
| Не понял, что и куда пытаешься подсунуть. Можно подробней, что надо сделать? Римас |
--
| CALL и NORESULTCALL - это ключевые слова для Клашиного SQL драйвера, которые драйвер должен преобразовать в правильний вызов процедуры для целевого сервера БД (в данном случае EXECUTE ...) Если тебе не надо получить данные из этой процедуры, то нужно писать правильный с точки зрения сервера БД скрипт, со всеми декларациями и пр. Если надо получить данные либо просто хочешь пользоваться CALL, то пиши свою процедуру с простыми параметрами, где сможешь декларировать все что надо и из Клашиного приложения вызывай ее. Я не большой знаток Кларион - методов вызова процедур, т.к. работаю с MAV ODBC библиотекой. Римас |
| Я же писал - NULL |
| -- Вы получили это сообщение, поскольку подписаны на группу "ClaList". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Здравствуйте, IgLowy!
Еще по твоему случаю, учитывая непонятные типы некоторых параметров хранимки,
могу посоветовать такой вариант:
1. Добиваемся безошибочного вызова этой хранимки из sql-менеджера
2. Пишем хранимку-обертку, в которой все необходимые данные берем из
временной таблички и вызываем нужную нам хранимку
3. В Клашиной проге нужные данные заносим во временную табличку и вызываем
хранимку-обертку, после чего берем результат из результирующей таблицы.
В этом случае можно вообще обойтись без каких-либо параметров - входные данные
заносим во временную табличку а результаты берем из результирующей таблицы!
Здравствуйте, Олег.
Вы писали 27 марта 2015 г., 22:33:32:
> Здравствуйте, IgLowy!
> Так предложили очень хорошее решение - попробуй сначала вызвать
> эту хранимку из sql-менеджера.
> По крайней мере, сразу выяснишь правильные форматы параметров.
> И вообще, совет - любые sql-запросы сначала проверяй в sql-менеджере
> и только после их отладки вставляй их уже в Клашин код.
> По другому очень сложно выловить ошибки!
Стесняюсь спросить, а о каком sql-менеджере идёт речь? под ним имеется ввиду какая-то из функций SQL Server Management Studio или это отдельный продукт?
у меня опыт работы с sql сервером всего пара дней :)
использовать временные таблички можно, но я и так собираюсь вести свои таблицы в формате tps, чтобы не трогать базу присланной программы. делать дополнительные таблицы не хотелось бы.
ещё и хранимка сама пишет данные в серверные таблицы. делать изменения на сервере - тем более не хочется. ФОМС должен каждый месяц присылать обновления таблиц и хранимок. в прошлую пятницу прислали первое обновление программы. народ уже жалуется на косяки после обновления. что они там поменяли и как...
мне сейчас хотелось бы понять некоторые вещи, связанные с использованием типов данных и объектов, описанных на сервере, которые мне надо использовать в своей программе.
с таблицами всё понятно: описываем в словаре, открываем в программе и юзаем. с хранимкой тоже вроде ясно: чёрный ящик, который вызываем по имени и которому скармливаем параметры.
но мне не очень понятно с типами, описанными на сервере. параметры табличного типа, которые мне надо сформировать перед вызовом хранимки, описаны на сервере http://prntscr.com/6n5zyv
вот rtfm по ним https://msdn.microsoft.com/ru-ru/library/bb510489.aspx
правильно ли мне перед вызовом хранимки описать самому эти типы заново, как я это делаю в кларионе с таблицами или каким-то образом я могу использовать уже сделанное на сервере описание?
не должно ли использование ссылки на этот тип в тексте sql-запроса в стиле
DECLARE @oper AS type_tbl_oper
автоматически брать описание типа с сервера?
или таки мне надо, как в примере, написать что-то типа:
CREATE TYPE type_tbl_oper AS TABLE ... ?
и насколько корректно использовать оператор create в данном контексте? думаю, что нет. ведь тип уже есть на сервере, а я его пытаюсь создать заново.
/* Declare a variable that references the type. */ и адаптировать под свои нужды - объявить свои табличные переменные и заполнить таблицы своими данными. Затем вызвать свою процедуру.
Все это желательно сделать одним Prop:SQL. Т.е. сначала сгенерировать скрипт в строковую переменную, а затем его выполнить.
PS. В данном случае, я бы завел на MSSQL свои таблички для этих типов и заполнил их в клаше,
а заполнение табличных переменных сделал как в примере выборкой из этих таблиц - INSERT ... SELECT.
Тогда гарантировано не налетишь на ограничение по длине ODBC запроса (ка-ца 4 Кб).
Не так эффективно, но зато попроще будет.
PPS. А там глядишь и всю свою задачу на скуль перетащишь ;-)) Успеха.
WBR, Nikolay Tsigouro
Здравствуйте, Nikolay.
Вы писали 30 марта 2015 г., 14:03:13:
> Любой. Лишь бы умел подключаться и запросы выполнять Родной (SQL
> SMS) тоже вполне годится.
по кнопке "создать запрос" в панели инструментов - это он вызывается?
> Все это желательно сделать одним Prop:SQL. Т.е. сначала
> сгенерировать скрипт в строковую переменную, а затем его выполнить.
я так и делаю. формирую в строку перечень операторов, потом её присваиваю в Prop:SQL. я приводил тут кусок кода. пока строка вписывалась в 1к.
мне потом надо будет ещё сделать расчёт стоимости за месяц. поэтому эффективность тоже будет нужна.
--
Вы получили это сообщение, поскольку подписаны на группу ClaList.
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/d/optout.
Example:
PROGRAM
MAP
CallProc(STRING)
END
MyFile FILE,DRIVER('MSSQL')
Record RECORD
c LONG
END
END
Ret LONG
Out STRING(10)
CODE
BIND('RetCode', Ret)
BIND('Out', Out)
CallProc('&RetCode = CALL StoredProcTest(''1'',&Out)')
MESSAGE(Return value of StoredProcTest =' & Ret)
MESSAGE(Output parameter of StoredProcTest =' & Out)
CallProc PROCEDURE(Str)
CODE
MyFile{PROP:SQL} = Str
--
--
Вы получили это сообщение, поскольку подписаны на группу ClaList.
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.