Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Засада. (число прочтений - 3782 )
U_zer
Экс-Участник


Засада.
01. Февраля 2007 :: 06:36
Печать  
База SQL. Версия 1С++ >= 2.0.3.1 Есть простой запрос:

Код
Выбрать все
select
БигСел.Товар [Товар $Справочник.Товары],
БигСел.Докум [Док $Документ],
БигСел.Ост [Ост $число],
БигСел.Рез [Рез $число],
БигСел.СумБаз [СумБаз $число],
БигСел.СумВал [СумВал $число]
from
    (select
	  РегОст.измТовар Товар,
	  null Докум,
	  РегОст.ресКоличествоОстаток Ост,
	  РегРез.ресКоличествоОстаток Рез,
	  0 СумБаз,
	  0 СумВал
     from $РегистрОстатки.Товары(:ДатаН,,измТовар in
	(select $ДокС.табТовар
	  from   $ДокументСтроки.Перемещение ДокС
	 where ДокС.iddoc = :ТД and $ДокС.табКоличество<>0
	) and измСклад = :Скл, (измТовар, измСклад),ресКоличество) РегОст
	left join $РегистрОстатки.РезервыТоваров(:ДатаН,,измТовар in
	(select $ДокС.табТовар
	 from $ДокументСтроки.Перемещение ДокС
	 where ДокС.iddoc = :ТД and $ДокС.табКоличество<>0
	) and измСклад = :Скл, (измТовар, измСклад),ресКоличество) РегРез on РегРез.измТовар =	  РегОст.измТовар and РегРез.измСклад = РегОст.измСклад
   union all
     select
     РегОст.измТовар,
     РегОст.измДокумент,
     РегОст.ресКоличествоОстаток,
     0,
     РегОст.ресСуммаБазОстаток,
     РегОст.ресСуммаВалОстаток
     from $РегистрОстатки.Товары(:ДатаН,, измТовар in
		 (select $ДокС.табТовар
		  from $ДокументСтроки.Перемещение ДокС
		  where ДокС.iddoc = :ТД and $ДокС.табКоличество<>0
		  ) and измСклад = :Скл,(измТовар,измДокумент),(ресКоличество, ресСуммаБаз, ресСуммаВал))  РегОст
	 where РегОст.ресКоличествоОстаток>0
 ) БигСел

Запрос.УстановитьТекстовыйПараметр("ДатаН", MW.ПолучитьДатуВремяИдДок(СформироватьПозициюДокумента(ТекущийДокумент())));
Запрос.УстановитьТекстовыйПараметр("Скл", загСклад);
Запрос.УстановитьТекстовыйПараметр("ТД", ТекущийДокумент());

ТЗн = Запрос.ВыполнитьИнструкцию(ТЗ);
ТЗн.Выгрузить(ТЗн1);
 



Все чудно, НО...

Если сделать
Код
Выбрать все
ТЗн.ВыбратьСтроки()
Пока Тзн.ПолучитьСтроку() = 1 Цикл
  Сообщить(Тзн.Док)
КонецЦикла  


, то все выводится правильно.

Код
Выбрать все
ТЗн1.ВыбратьСтроки()
Пока Тзн1.ПолучитьСтроку() = 1 Цикл
  Сообщить(Тзн1.Док)
КонецЦикла  

,появляется какой-то левый документ.

В отладчике во втором цикле написано следующее:

+Тзн1.Док     -  (строка с непр. документом)

Хотя в ост. строках с документами пишется так:
+Тзн1.Док - "ВводОстатков"

Поэтому, получается, что ТЗн.Выгрузить(ТЗн1); писать НЕЛЬЗЯ!!!!!
Приходится вручную созд. ТаблицуЗначений и делать проверку типа:
Код
Выбрать все
ТЗн.ВыбратьСтроки()
Пока Тзн.ПолучитьСтроку() = 1 Цикл
  Тзн1.НоваяСтрока();
  Если ПустаяСтрока(Строка(Тзн.Док)) = 0 Тогда
     Тзн1.Док = Тзн.Док
  КонецЕсли
КонецЦикла
 



Блин, извиняюсь, что путанно, но я в непонятках. Что делать? Переписывать куски получения
результатов из запроса или у меня руки кривые?

  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Засада.
Ответ #1 - 01. Февраля 2007 :: 06:48
Печать  
А чё-т я непонял, метод ВыполнитьИнструкцию имеет же следующий синтаксис:
ВыполнитьИнструкцию([ТекстЗапроса], [ОбъектРезультатов], [Очищать])

а Загрузить() также работает?
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Засада.
Ответ #2 - 01. Февраля 2007 :: 07:07
Печать  
ВыполнитьИнструкцию() и так и так работает.
А что за Загрузить()?
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Засада.
Ответ #3 - 01. Февраля 2007 :: 07:11
Печать  
Надо бы ТЗн = Запрос.ВыполнитьИнструкцию(ТЗ, , 1);
  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Засада.
Ответ #4 - 01. Февраля 2007 :: 07:18
Печать  
Arta писал(а) 01. Февраля 2007 :: 07:11:
Надо бы ТЗн = Запрос.ВыполнитьИнструкцию(ТЗ, , 1);

Зачем?
  

FormEx developer
Наверх
www  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Засада.
Ответ #5 - 01. Февраля 2007 :: 07:19
Печать  
Цитата:
База SQL. Версия 1С++ >= 2.0.3.1 Есть простой запрос:

Попробуй вместо "null Докум," поставить " '' Докум,".
  

FormEx developer
Наверх
www  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Засада.
Ответ #6 - 01. Февраля 2007 :: 07:19
Печать  
Цитата:
ВыполнитьИнструкцию() и так и так работает.

А, понял, у тебя ТЗ - это текст запроса, просто подумал, что это ТаблицаЗначений. Сразу как-то не вьехал ТЗ, ТЗн, ТЗн1...
Цитата:
А что за Загрузить()?

Ну если сделать:
Код
Выбрать все
ТЗн1 = создатьОбъект("ТаблицаЗначений");
ТЗн1.Загрузить(ТЗн); 

  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Засада.
Ответ #7 - 01. Февраля 2007 :: 07:29
Печать  
Цитата:
Цитата:
База SQL. Версия 1С++ >= 2.0.3.1 Есть простой запрос:

Попробуй вместо "null Докум," поставить " '' Докум,".


Я пытался так: case when БигСел.Докум = null then $ПустойИД else БигСел.Докум end
Та же фигня ...
  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Засада.
Ответ #8 - 01. Февраля 2007 :: 07:33
Печать  
Цитата:
Цитата:
Цитата:
База SQL. Версия 1С++ >= 2.0.3.1 Есть простой запрос:

Попробуй вместо "null Докум," поставить " '' Докум,".


Я пытался так: case when БигСел.Докум = null then $ПустойИД else БигСел.Докум end
Та же фигня ...

А ты попытайся еще так, как я сказал.
  

FormEx developer
Наверх
www  
IP записан
 
U_zer
Экс-Участник


Re: Засада.
Ответ #9 - 01. Февраля 2007 :: 11:19
Печать  
Сделал, результат тот же.  Печаль

Мало того, добавил в селект

Код
Выбрать все
  БигСел.ВД [Док_вид $число]
...

 во втором подселекте
 inner join _1sjourn j (nolock) on j.iddoc = Right(РегОст.измДокумент,9)
 



Так вот, при получении рез в ТЗН и послед просмотре, получаем

11627 0
30437 0
17810 0
30438 0
33072 0
17810 310 ВводОстатковТоваров КЭ-19619 (31.12.05)
11627 699 ПриходнаяНакл 90012771 (18.01.06)
33072 310 ВводОстатковТоваров КЭ-19619 (31.12.05)
30437 310 ВводОстатковТоваров КЭ-19619 (31.12.05)
30438 2711
                   
Это после Тзн.Выгрузить(Тзн1)

11627 0
30437 0
17810 0
30438 0
33072 0
17810 310 ВводОстатковТоваров КЭ-19619 (31.12.05)
11627 699 ПриходнаяНакл 90012771 (18.01.06)
33072 310 ВводОстатковТоваров КЭ-19619 (31.12.05)
30437 310 ВводОстатковТоваров КЭ-19619 (31.12.05)
30438 2711 КомплектацияТМЦ 0000000008 (11.01.06)

Самое интересное, что этот товар в комплектации есть, но он РАСХОДУЕТСЯ, то
есть остатка вообще быть не должно ... 

Я в ауте!
« Последняя редакция: 01. Февраля 2007 :: 12:21 - »  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Засада.
Ответ #10 - 01. Февраля 2007 :: 15:55
Печать  
В "Query Analyzer" пробовал свой запрос прогнать? А отдельно каждую часть union?
  

FormEx developer
Наверх
www  
IP записан
 
U_zer
Экс-Участник


Re: Засада.
Ответ #11 - 02. Февраля 2007 :: 10:23
Печать  
Цитата:
В "Query Analyzer" пробовал свой запрос прогнать? А отдельно каждую часть union?


Вот Ф%К, сделал Тест и испр базы из 1С, из SQL никаких ошибок не выдавал,
и все стало нормально, а ведь где-то писали, что для SQL баз не рекомендуется использовать
Тест и испр из 1С. Кому верить?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать