Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Мдя... "Надо чаще встречаться" с 1С++ (число прочтений - 8001 )
Oliver
Junior Member
**
Отсутствует



Сообщений: 25
Местоположение: SPb
Зарегистрирован: 25. Мая 2006
Пол: Мужской
Мдя... "Надо чаще встречаться" с 1С++
23. Ноября 2006 :: 12:06
Печать  
Подключаюсь к DBF через OLEDB

В запросе есть строки

Select
....
СуммаОплОбщ,
ICASE(докопл_вид=$ВидДокумента36.ПКО,СуммаОплОбщ,0) as СуммаОплОбщНал,
ICASE(докопл_вид=$ВидДокумента36.СтрокаВыпискиПриход,СуммаОплОбщ,0) as СуммаОплОбщБезНал,
докопл_вид,
$ВидДокумента36.СтрокаВыпискиПриход as IDDOCDEF_Выписка,
....

Первая строка отрабатывает нормально - вторая НЕТ. Все нули. Только не надо писать что не работает потому, что "докопл_вид" в выборке не встречается нужный. Специально добавил еще две строки, чтобы проверить визуально. В выборке полно строк, где докопл_вид=$ВидДокумента36.СтрокаВыпискиПриход=' 13E'

В чем же дело, а?

Кстати, если у кого возникнет мысль. IIF() тоже пробовал. Результат такой же.
  
Наверх
 
IP записан
 
Oliver
Junior Member
**
Отсутствует



Сообщений: 25
Местоположение: SPb
Зарегистрирован: 25. Мая 2006
Пол: Мужской
Re: Мдя... "Надо чаще встречаться" с 1С++
Ответ #1 - 23. Ноября 2006 :: 15:49
Печать  
Ёлы-палы.
Люди!

Я конечно понимаю, что я ничего не понимаю, но чтобы ни одного ответа???

Я хочу сообщить, что работа функций IIF() и ICASE() в 1С++ 2021 мне абсолютно непонятна, не поддается предсказаниям и вызывает выползания глаз из орбит.

Кто хочет посмотреть на получающиеся безобразия?

Например, меняю вышеприведенный запрос на след:

Select
....
СуммаОплОбщ,
ICASE(докопл_вид=$ВидДокумента36.ПКО,СуммаОплОбщ,0) as СуммаОплОбщНал,
ICASE(докопл_вид=$ВидДокумента36.СтрокаВыпискиПриход,0,1) as СуммаОплОбщБезНал,
докопл_вид,
$ВидДокумента36.СтрокаВыпискиПриход as IDDOCDEF_Выписка,
....

Все работает. Колонка СуммаОплОбщБезНал равна 0 там где надо и 1 там где должно.

Делаю так:

Select
....
СуммаОплОбщ,
ICASE(докопл_вид=$ВидДокумента36.ПКО,СуммаОплОбщ,0) as СуммаОплОбщНал,
ICASE(докопл_вид=$ВидДокумента36.СтрокаВыпискиПриход,1,0) as СуммаОплОбщБезНал,
докопл_вид,
$ВидДокумента36.СтрокаВыпискиПриход as IDDOCDEF_Выписка,
....

Естественно тоже все хорошо. Почему бы и не быть хорошо....

Что самое интересное, стоит написать еще и так:

ICASE(докопл_вид=$ВидДокумента36.СтрокаВыпискиПриход,0,СуммаОплОбщ) as СуммаОплОбщБезНал,

Так тоже работает, и вот видимо почему...

Дело в том, что в исходном варианте (см. пред. пост) выборка практически всегда получается такой, что первая строка (одна или несколько) имеет ДокОпл_вид=$ВидДокумента36.ПКО, соответственно в поле СуммаОплОбщБезНал попадает нолик. И видимо (я так предполагаю) происходит кривизна какая-то при типизации поля ТЗ по умолчанию.

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

Буду завтра дальше заниматься бредом по поиску привидений (в смысле тех, которые в старых домах с прохудившейся крышей живут).

ЗЫ: Кстати, попытался явно типизировать как число. Не помогло.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Мдя... "Надо чаще встречаться" с 1С++
Ответ #2 - 23. Ноября 2006 :: 16:53
Печать  
Ну, по той информации, что есть вряд ли можно сказать, в чем дело... Наверное, лучше бы ты привел полный текст запроса или даже отчета. Лично я вроде бы не сталкивался с проблемами в использовании IIF. У меня есть как отчет, где их несколько, так и отчет где есть один здоровенный с вложенными IIF'ами. Выглядит жутковато, но работает корректно Улыбка
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Мдя... "Надо чаще встречаться" с 1С++
Ответ #3 - 23. Ноября 2006 :: 18:16
Печать  
Это работает (см. ниже) и выдает верный результат?

Код
Выбрать все
SELECT
	T.Doc as [Док $Документ],
	T.Док_вид,
	ICASE(T.Док_вид = $ВидДокумента36.РасходнаяНакладная, 1, 0) as ForOliver
FROM (
	SELECT
		Jrn.IDDoc as Doc,
		Jrn.IDDocDef as Док_вид
	FROM 1SJourn as Jrn
) as T
 

  
Наверх
ICQ  
IP записан
 
Oliver
Junior Member
**
Отсутствует



Сообщений: 25
Местоположение: SPb
Зарегистрирован: 25. Мая 2006
Пол: Мужской
Re: Мдя... "Надо чаще встречаться" с 1С++
Ответ #4 - 24. Ноября 2006 :: 05:12
Печать  
spock писал(а) 23. Ноября 2006 :: 18:16:
Это работает (см. ниже) и выдает верный результат?

Код
Выбрать все
SELECT
	T.Doc as [Док $Документ],
	T.Док_вид,
	ICASE(T.Док_вид = $ВидДокумента36.РасходнаяНакладная, 1, 0) as ForOliver
FROM (
	SELECT
		Jrn.IDDoc as Doc,
		Jrn.IDDocDef as Док_вид
	FROM 1SJourn as Jrn
) as T
 



Работает. Да и с чего бы не работать?

Замечу, в моем первом и втором посте - две строчки с ICASE, первая то отрабатывает без проблем... Причем стабильно, независимо ни от чего (заменял ICASE на IIF, менял порядок следования строк в запросе, менял алиасы полей в логическом выражении и т.д., т.е. весь бред, что приходил в голову). А вторая строка не отрабатывает. Из этого сделал вывод, что утверждение о непонятности и глючности работы ICASE преждевременно. Скорее всего дело в чем-то другом....

Вот такой запрос уже не работает.
Все нули и в первом и во втором ICASE

Код
Выбрать все
SELECT
T.Doc as [Док $Документ],
T.Док_вид,

ICASE(T.Док_вид = $ВидДокумента36.Реализация, 1555, 0) as ForOliver,
ICASE(T.Док_вид = $ВидДокумента36.СтрокаВыпискиПриход, 27456.324, 0) as ForOliver2

FROM (
	SELECT
		Jrn.IDDoc as Doc,
		Jrn.IDDocDef as Док_вид
	FROM 1SJourn as Jrn
	) as T 



И дело скорее всего в типизации или чем-то около. В моем случае в приведенном выше запросе функции в первых строках должны выдавать (и естественно выдают) 0, т.к. первыми в базе идут документы типа ВводОстатков и т.п.
Так вот если в качестве True выражений ставить целые числа длиной 1 (т.е. 1,2,3,4,5,6,7,8,9) то все работает. А как только числа становятся нецелыми или длина целой части больше 1 - вся красота слетает.

Остается разобраться, типизация ли это самих колонок запроса (для полей, выбираемых из таблиц тип такой, какой у колонки таблицы, а вот как устанавливается тип для вычисляемых полей?) или уже про типизации типами 1С в получающейся ТЗ...

  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Мдя... "Надо чаще встречаться" с 1С++
Ответ #5 - 24. Ноября 2006 :: 07:17
Печать  
Попробуй закастить значения: CAST(XXX as NUMERIC(10,3))
  
Наверх
ICQ  
IP записан
 
Oliver
Junior Member
**
Отсутствует



Сообщений: 25
Местоположение: SPb
Зарегистрирован: 25. Мая 2006
Пол: Мужской
Re: Мдя... "Надо чаще встречаться" с 1С++
Ответ #6 - 24. Ноября 2006 :: 07:22
Печать  
spock писал(а) 24. Ноября 2006 :: 07:17:
Попробуй закастить значения: CAST(XXX as NUMERIC(10,3))


Мысль! Должно заработать!

ГОЛОВА!!!!

Спасибо.

Рекомендую такие вещи в фак что ли... Такая неявная непонтка.
Что интересно, пока ждал ответов - залил базу на скуль и попробовал через 1СQA - работает без каста. Но там подключение через ОДБЦ...


ЗЫ: Заработало!  Очень довольный
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Мдя... "Надо чаще встречаться" с 1С++
Ответ #7 - 24. Ноября 2006 :: 07:25
Печать  
Oliver писал(а) 24. Ноября 2006 :: 07:22:
Рекомендую такие вещи в фак что ли... Такая неявная непонтка.

http://itland.ru/forum//index.php?s=&showtopic=13339&view=findpost&p=70358
Такая вот особенность у этого провайдера...
  
Наверх
ICQ  
IP записан
 
Oliver
Junior Member
**
Отсутствует



Сообщений: 25
Местоположение: SPb
Зарегистрирован: 25. Мая 2006
Пол: Мужской
Re: Мдя... "Надо чаще встречаться" с 1С++
Ответ #8 - 24. Ноября 2006 :: 07:32
Печать  
ОХ!

Прошу прощения... На ИтЛанд даже не заглянул....  Смущённый

Я не обратил внимания, наверняка обсуждалась возможность перенести ветки с ИтЛанда если не все, то некоторые достаточно важные...
Чем закончилось?
  
Наверх
 
IP записан
 
Oliver
Junior Member
**
Отсутствует



Сообщений: 25
Местоположение: SPb
Зарегистрирован: 25. Мая 2006
Пол: Мужской
Re: Мдя... "Надо чаще встречаться" с 1С++
Ответ #9 - 24. Ноября 2006 :: 07:53
Печать  
ЕЩЕ НАШЕЛ.

Это получается ВСЕ поля нужно так кастить!
Делаю выборку по запросу в (1), где закастены IIFы. Вернее ICASEы.
В вырожденном случае, когда в нее попадают только один единственный документ (например ПКО) итог по колонке СуммаОплОбщ и СуммаОплОбщНал должен быть одинаковым. и соотв. сумме ПКО. Так вот покащенная колонка дает правильный результат, а непокащенная СуммаОплОбщ, которая не вычисляется а просто выбирается из регистра - неправильный. И скорее всего по той же причине.....

Может что-то придумать, чтобы глобально внести исправления в саму 1С++ и "завернуть" эти особенности? Например при явной типизации к 1С [$Число] метапарисить уже с кастом?
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Мдя... "Надо чаще встречаться" с 1С++
Ответ #10 - 24. Ноября 2006 :: 08:03
Печать  
Oliver писал(а) 24. Ноября 2006 :: 07:32:
Чем закончилось?

Нужна жертва, которая все это сделает. Конвертилки, похоже, нет, а базу форума не дают.
  
Наверх
ICQ  
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Мдя... "Надо чаще встречаться" с 1С++
Ответ #11 - 24. Ноября 2006 :: 08:07
Печать  
Сдается мне, что у тебя подзапросы. Да/Нет/Отмена? Улыбка
  
Наверх
ICQ  
IP записан
 
Oliver
Junior Member
**
Отсутствует



Сообщений: 25
Местоположение: SPb
Зарегистрирован: 25. Мая 2006
Пол: Мужской
Re: Мдя... "Надо чаще встречаться" с 1С++
Ответ #12 - 24. Ноября 2006 :: 08:45
Печать  
Куда ж без них.  Подмигивание

Но ведь ничуть не легче от осознания, что такая бяка получается при выборке вычисляемых полей и выборке из подзапросов, когда тип явно не определен и Олядб принимает сама решение, как типизировать...
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Мдя... "Надо чаще встречаться" с 1С++
Ответ #13 - 24. Ноября 2006 :: 08:48
Печать  
Покажи запрос - попробую пояснить.
  
Наверх
ICQ  
IP записан
 
Oliver
Junior Member
**
Отсутствует



Сообщений: 25
Местоположение: SPb
Зарегистрирован: 25. Мая 2006
Пол: Мужской
Re: Мдя... "Надо чаще встречаться" с 1С++
Ответ #14 - 24. Ноября 2006 :: 08:54
Печать  
Стыдно....  Смущённый

Я полгода не касался ни к запросам ни к 1СРР. Так что очень прошу не смеяццо...

     |Select
     |      Клиент as [Клиент $Справочник.Контрагенты],
     |      Отгрузка as [Отгрузка $Документ.Реализация],
     |      докопл as [докопл $Документ],

     //Это как раз не имеет отношение - вставлено для проверки и наглядности
     |      ВидДокопл,
     |   $ВидДокумента36.СтрокаВыпискиПриход as Вид36,


     |      Товар as [Товар $Справочник.Номенклатура],
     |      CAST(СуммаНаклОбщ as Numeric(15,5)) as СуммаНаклОбщ,
     |      CAST(СуммаОплОбщ1 as Numeric(15,5)) as СуммаОплОбщ,
     |      CAST(IIF(ВидДокопл=$ВидДокумента36.ПКО,Осн.СуммаОплОбщ1,0) as Numeric(15,5))                              as СуммаОплОбщНал,
     |      CAST(IIF((ВидДокопл=$ВидДокумента36.СтрокаВыпискиПриход),Осн.СуммаОплОбщ1,0) as Numeric(15,5))      as [СуммаОплОбщБезНал $Число],


     |      CAST(СуммаПоТовару as Numeric(15,5)) as СуммаПоТовару,
     |      CAST(СуммаОплПоТовару as Numeric(15,5)) as СуммаОплПоТовару,
     |      CAST(IIF(ВидДокопл=$ВидДокумента36.ПКО,Осн.СуммаОплПоТовару,0) as Numeric(15,5))                              as СуммаОплПоТоваруНал,
     |      CAST(IIF(ВидДокопл=$ВидДокумента36.СтрокаВыпискиПриход,Осн.СуммаОплПоТовару,0) as Numeric(15,5))      as СуммаОплПоТоваруБезНал,
     //|      Коэф,
     //|      КредДок_вид,
     |      КредДок as [КредДок $Документ]
     |From
     |(Select
     |      _1SJOURN.Date                        as ДатаОплаты,
     |      $Шапка.Контрагент                  as Клиент,
     |      Накл.IDDOC                              as Отгрузка,
     |      $Рег.ДокументОплаты                  as докопл,
     |      $Накл.Номенклатура                  as Товар,
     |      $Шапка.СуммаВзаиморасчетов      as СуммаНаклОбщ,
     |      $Рег.СуммаРуб                        as СуммаОплОбщ1,
     |      $Накл.Сумма                              as СуммаПоТовару,
     |      (($Рег.СуммаРуб)*($Накл.Сумма)/($Шапка.СуммаВзаиморасчетов)) as СуммаОплПоТовару,
     //|      ($Накл.Сумма/$Шапка.СуммаВзаиморасчетов) as Коэф,
     |      $Рег.КредДокумент                  as КредДок,
     |      Left($Рег.ДокументОплаты,4)      as ВидДокопл,
     |      Left($Рег.КредДокумент,4)      as КредДок_вид
     |From
     |      $Документ.Реализация as Шапка,
     |      $ДокументСтроки.Реализация as Накл,
     |      1SJOURN as _1SJOURN,
     |      $Регистр.Покупатели as Рег
     |where
     |      _1SJOURN .iddoc=Right(Рег .IDDOC,9)
     |      and ((_1SJOURN .iddocdef=$ВидДокумента36.СтрокаВыпискиПриход) or (_1SJOURN .iddocdef=$ВидДокумента36.ПКО))
     |      and ($ВидДокумента36.Реализация+Шапка .IDDOC)=$Рег.КредДокумент
     |      and Накл .IDDOC=Шапка .IDDOC
     |      and Рег .DebKred = 1) as Осн
     |Where
     |      ДатаОплаты >= Cast(:ВыбНачПериода~~ as DateTime)
     |      and ДатаОплаты <= Cast(:ВыбКонПериода~~ as DateTime)
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать