Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Помогите выполнить ХП (число прочтений - 9303 )
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите выполнить ХП
Ответ #15 - 22. Февраля 2007 :: 07:22
Печать  
Уж простите за мою тупость, но как? Делаю так:
Код
Выбрать все
		РСЮрЛица = СоздатьОбъект("ODBCRecordSet");
	РСЮрЛица.УстБД(ОДБЦБаза);

		РСЮрЛица.Подготовить("{call p_Insert_Juridical_Perosn (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");

	РСЮрЛица.ДобПараметр(1,15,20,0,"@asABBREVIATED_NAME");//asABBREVIATED_NAME
	РСЮрЛица.ДобПараметр(1,15,300,0,"@asFIRM_NAME");//asFIRM_NAME
	РСЮрЛица.ДобПараметр(1,15,12,0,"@asINN");//asINN
	РСЮрЛица.ДобПараметр(1,15,20,0,"@asTelePhone");//asTelePhone
	РСЮрЛица.ДобПараметр(1,15,30,0,"@asCountry");//asCountry
	РСЮрЛица.ДобПараметр(1,15,30,0,"@asState");//asState
	РСЮрЛица.ДобПараметр(1,15,30,0,"@asCity");//asCity
	РСЮрЛица.ДобПараметр(1,15,30,0,"@asStreet");//asStreet
	РСЮрЛица.ДобПараметр(1,15,10,0,"@asHouse_Number");//asHouse_Number
	РСЮрЛица.ДобПараметр(1,15,10,0,"@asApartment_Number");//asApartment_Number
	РСЮрЛица.ДобПараметр(1,15,30,0,"@asRegion");//asRegion
	РСЮрЛица.ДобПараметр(1,15,10,0,"@asZip");//asZip
	РСЮрЛица.ДобПараметр(1,15,10,0,"@asBuilding");//asBuilding
	РСЮрЛица.ДобПараметр(1,15,40,0,"@asNP");//asNP

	РСЮрЛица.ДобПараметр(2,4,8,0,"@asRet");//asRet
//.....
	РСЮрЛица.УстПараметр(1,СокрЛП(ЛЕВ(Контрагент.Наименование,20)));
	РСЮрЛица.УстПараметр(2,СокрЛП(ЛЕВ(Контрагент.ПолнНаименование,300)));
	РСЮрЛица.УстПараметр(3,СокрЛП(ЛЕВ(Контрагент.ИНН,12)));
	РСЮрЛица.УстПараметр(4,СокрЛП(ЛЕВ(Контрагент.Телефоны,20)));
	РСЮрЛица.УстПараметр(5,Страна);
	РСЮрЛица.УстПараметр(6,СокрЛП(ЛЕВ(Контрагент.Регион.Наименование,30)));
	РСЮрЛица.УстПараметр(7,СокрЛП(ЛЕВ(Контрагент.Город.Наименование,30)));
	РСЮрЛица.УстПараметр(8,СокрЛП(ЛЕВ(Контрагент.Улица.ПолноеНазвание,30)));
	РСЮрЛица.УстПараметр(9,СокрЛП(ЛЕВ(Контрагент.Дом,10)));
	РСЮрЛица.УстПараметр(10,СокрЛП(ЛЕВ(Контрагент.Кв_Оф,10)));
	РСЮрЛица.УстПараметр(11,СокрЛП(ЛЕВ(Контрагент.Район.Наименование,30)));
	РСЮрЛица.УстПараметр(12,СокрЛП(ЛЕВ(Контрагент.Индекс,10)));
	РСЮрЛица.УстПараметр(13,СокрЛП(ЛЕВ(Контрагент.Корпус,10)));
	РСЮрЛица.УстПараметр(14,СокрЛП(ЛЕВ(Контрагент.НасПункт.ПолноеНазвание,40)));

	Рез = РСЮрЛица.ВыполнитьИнструкцию();

		ВозвращаемоеЗначение = РСЮрЛица.ПолучПараметр(15); //чтение параметра типа OUTPUT после выполнения.
		Если Число(ВозвращаемоеЗначение)=0 Тогда
		    Сообщить("Уже был "+Рез+ТипЗначенияСтр(ВозвращаемоеЗначение));
		Иначе
			Сообщить("Добавлен "+Рез+ТипЗначенияСтр(ВозвращаемоеЗначение));
		КонецЕсли;
 



На сервер ничего не отправляется. Может я как-то не так с параметрами работаю? МОжет не в таком порядке всё надо делать? Но я уже всё перепробывал...
Какая строка должна быть, если сделать
Код
Выбрать все
РСЮрЛица.Отладка(1); 

?
У меня всегда такая: Цитата:
{call p_Insert_Juridical_Perosn (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}


P.S. Соединение с базой точно есть. Такой вот код:
Код
Выбрать все
РСЮрЛица = СоздатьОбъект("ODBCRecordSet");
	РСЮрЛица.УстБД(ОДБЦБаза);
	ТекстЗапроса = "
	|select top 1 *
	|from www_osago_attribute"
	;
	ТЗ = РСЮрЛица.ВыполнитьИнструкцию(ТекстЗапроса);
	ТЗ.ВыбратьСтроку(); 


Отрабатывает нормально
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите выполнить ХП
Ответ #16 - 22. Февраля 2007 :: 11:31
Печать  
После долгих изысканий нашёл такой вот выход:
вместо строк
Код
Выбрать все
РСЮрЛица.ДобПараметр(1,15,20,0,"@asABBREVIATED_NAME");//asABBREVIATED_NAME 


пишем такое
Код
Выбрать все
РСЮрЛица.ДобПараметр(1,15,20,0);//asABBREVIATED_NAME 


и всё проходит!  Улыбка
Но сути проблемы я так и не понял... Объясните, пжлст.
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Помогите выполнить ХП
Ответ #17 - 22. Февраля 2007 :: 11:41
Печать  
Вообще-то именованые параметры в твоей задаче действительно не нужны.
Их применение в ODBC ограничивается только для вызова процедур с параметрами по-умолчанию, и при перестановке фактических параметров процедур местами.. (короче, мудатень полная, больше путаницы чем толку, поэтому я никогда их не использовал)
Но у тебя вроде все задано правльно и это не должно мешать, м.б. в ODBCRecordset что-то накосячено, явление требует тщательного расследования.
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите выполнить ХП
Ответ #18 - 22. Февраля 2007 :: 11:52
Печать  
Ещё вот такой вопрос. Я объявляю возвращаемую переменную как int:
Код
Выбрать все
РСЮрЛица.ДобПараметр(2,4,8,0);//asRet 


Если после выполнения сделать:
Код
Выбрать все
ВозвращаемоеЗначение = РСЮрЛица.ПолучПараметр(15);
Сообщить(ТипЗначенияСтр(ВозвращаемоеЗначение)) 


То сообщает всегда "Строка". Почему?
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Помогите выполнить ХП
Ответ #19 - 22. Февраля 2007 :: 12:42
Печать  
А что в этой строке?
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите выполнить ХП
Ответ #20 - 22. Февраля 2007 :: 13:16
Печать  
DmitrO писал(а) 22. Февраля 2007 :: 12:42:
А что в этой строке?

Там либо "0" либо "1", т.е то, что и должно быть ("@asRet"), но почему-то строка, а не число.
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Помогите выполнить ХП
Ответ #21 - 22. Февраля 2007 :: 13:42
Печать  
Код
Выбрать все
почему-то строка, а не число 


Судя по всему это баг.
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите выполнить ХП
Ответ #22 - 22. Февраля 2007 :: 13:50
Печать  
Ну да ладно, пока написал так:
Код
Выбрать все
Если Число(ВозвращаемоеЗначение) =0 Тогда
		    Сообщить("Уже был ");
		Иначе
			Сообщить("Добавлен ");
		КонецЕсли; 


Правда сначало было без Число() и я долго не мог понять в чем прикол...

Тут возник такой вопрос. Как быть с "set nocount on", если в теле одной ХП вызывается другае ХП? Достаточно ли поставить только в первой?
У меня конкретно такой случай:
Первая процедура, собственно которую я и вызываю, p_Insert_PhysicalPerson:
Код
Выбрать все
CREATE  Procedure [dbo].p_Insert_PhysicalPerson
	@asFirstName varchar(25) ,
	@asMiddleName varchar(25),
	@asLastName varchar(25),
	@asBirthDate varchar(20),
	@asSex varchar(1),
	@asRet int output
AS
set nocount on
DECLARE @SUBJECT_ID as bigint
SELECT [FIRST_NAME],[MIDDLE_NAME],[LAST_NAME],[BIRTH_DATE],[SEX]
	from dbo.PHYSICAL_PERSON
	where FIRST_NAME=@asFirstName and MIDDLE_NAME=@asMiddleName and LAST_NAME=@asLastName
if @@ROWCOUNT=0
	begin
		EXEC   dbo.p_InsertSubject 'PHYSICAL_PERSON',@SUBJECT_ID OUTPUT
		INSERT INTO [dbo].[PHYSICAL_PERSON] ([SUBJECT_ID],
							[FIRST_NAME],
							[MIDDLE_NAME],
							[LAST_NAME],
							[BIRTH_DATE],
							[SEX],
							[LIVE_ADDR_EQU_REG_ADDR])
			 VALUES(@SUBJECT_ID,
				@asFirstName,
				@asMiddleName,
				@asLastName,
				@asBirthDate,
				@asSex,
				1)
		set @asRet=1
	end
else
	begin
		set @asRet=0
	end
GO 



и вторая, которая используется в первой:
Код
Выбрать все
CREATE  Procedure [dbo].p_InsertSubject
	@asSubjectType varchar(20),
	@asRet bigint output
AS
   INSERT INTO [dbo].[SUBJECT]([SUBJECT_TYPE_ID])
	  VALUES(@asSubjectType)
   set @asRet = @@IDENTITY

GO
 


Обязательно ли делать во второй "nocount on"? И вообще это будет работать?
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Помогите выполнить ХП
Ответ #23 - 22. Февраля 2007 :: 14:37
Печать  
Точно не помню, скорее всего надо везде ставить. Да и надежнее так, вдруг начнешь вызывать не из процедуры.
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите выполнить ХП
Ответ #24 - 26. Февраля 2007 :: 12:38
Печать  
Ещё такой вопрос:
Возможно ли в моей ситуации (ситуации, где есть необходимо получать output-параметры) пользоваться методом ВыполнитьSQL_ИзТЗ?
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Помогите выполнить ХП
Ответ #25 - 26. Февраля 2007 :: 14:07
Печать  
Нет, т.к. этот метод выполняет запрос для каждой строки. Как при этом получать output параметры? Получишь только от последнего запроса.
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите выполнить ХП
Ответ #26 - 26. Февраля 2007 :: 14:11
Печать  
DmitrO писал(а) 26. Февраля 2007 :: 14:07:
Нет, т.к. этот метод выполняет запрос для каждой строки. Как при этом получать output параметры? Получишь только от последнего запроса.

надеялся: "а вдруг output-параметры потом сами возвращаются в соответствующие строки и столбцы ТЗ".  Очень довольный
ну конечно это всё так, мелочи...
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Помогите выполнить ХП
Ответ #27 - 26. Февраля 2007 :: 17:19
Печать  
На сколько я помню, это там не сделано.
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите выполнить ХП
Ответ #28 - 01. Марта 2007 :: 06:57
Печать  
Наткнулся ещё на одну проблему.
Можно ли как-нибудь получить значения нескольких output-параметров?
Пример:
Код
Выбрать все
РСПолис.Подготовить("{call p_Insert_PoliceWWW_with_Pay (?,?,?)}");
РСПолис.ДобПараметр(1,15,8,0);//asContract_ID
//выходные
РСПолис.ДобПараметр(2,4,8,0);//asRet_Transport_Subject_ID    
РСПолис.ДобПараметр(2,4,8,0);//asRet_Contract_ID		  


Выполняется нормально. Но как вытащить эти параметры? Делаю как и в случае с одним параметром:
Код
Выбрать все
Результаты = РСПолис.ВыполнитьИнструкцию();
//Результаты.ВыбратьСтроку();
Сообщить(""+РСПолис.ПолучПараметр(3)); 


Но так не прокатывает.
В профайлере выполняется вот такое:
Цитата:
declare @P1 int
set @P1=40581
declare @P2 int
set @P2=36101
exec p_Insert_PoliceWWW_with_Pay '40581', @P1 output, @P2 output
select @P1, @P2

Что делать?  Нерешительный
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать