Вход | Регистрация

  1  2
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: 1С++ запрос

v7: 1С++ запрос
Я
   bananan
 
08.01.13 - 12:47
Добрый день! Нужна помощь в переделке запроса.
Запрос Такой:
    ТекстЗапроса = "
    |SELECT
    | Клиент [Клиент $Справочник.Клиенты] 
    |,Агент [Агент $Справочник.Агент]
    |,Заказ [Заказ $Документ]  
    |,НачОст
    |,Приход
    |,Расход
    |,КонОст
    |,ПрошлоДней
    |,Долг
    |,Переплата
    |,Отсрочка
    |,CASE WHEN ПрошлоДней > Отсрочка THEN ROUND((ПрошлоДней-Отсрочка) * (:процент) * Долг / 100,2) ELSE 0 END as Пеня
    |
    |FROM
    |(
    |SELECT
 
   |
    | *    
    |,CASE WHEN КонОст<0 THEN КонОст ELSE 0 END Долг
    |,CASE WHEN КонОст>0 THEN КонОст ELSE 0 END Переплата
    |,CASE WHEN $ПоследнееЗначение.Клиенты.СрокКредита(Клиент, :ТекДата) = 0 
    | THEN :Дней
    |    ELSE $ПоследнееЗначение.Клиенты.СрокКредита(Клиент, :ТекДата) END Отсрочка
    
    | FROM
    |(
    |SELECT 
    |  Журнал.IDDOCDEF 
    |, (DATEDIFF(day,LEFT(Журнал.DATE_TIME_IDDOC, 8),:Дата2)) AS ПрошлоДней
    |, CASE WHEN Журнал.IDDOCDEF = $ВидДокумента.РасходнаяНакладная"+?(ф2=1,"Н","")+" THEN $РН.Агент ELSE $Ост.Агент END Агент
    |, ВЗОст.Клиент Клиент
    |, ВЗОст.Заказ Заказ
    |, ВЗОст.СуммаОснНачальныйОстаток НачОст
    |, ВЗОст.СуммаОснПриход Приход
    |, ВЗОст.СуммаОснРасход Расход
    |, ВЗОст.СуммаОснКонечныйОстаток as КонОст
    |  FROM $РегистрОстаткиОбороты.Взаиморасчеты"+?(ф2=1,"Нал","")+"(:Дата1,:Дата2~,,Движения,,,(Клиент, Заказ),СуммаОсн) AS ВЗОст
    |  LEFT JOIN _1SJOURN AS Журнал ON Журнал.IDDOC = RIGHT(ВЗОст.Заказ,9)
    |  LEFT JOIN $Документ.РасходнаяНакладная"+?(ф2=1,"Н","")+" AS РН ON Журнал.IDDOC = РН.IDDOC
    |  LEFT JOIN $Документ.Остатки"+?(ф2=1,"Нал","Взаиморасчетов")+" AS Ост ON Ост.IDDOC = Журнал.IDDOC
    |  WHERE Журнал.IDDOCDEF IN  ($ВидДокумента.РасходнаяНакладная"+?(ф2=1,"Н","")+",$ВидДокумента.Остатки"+?(ф2=1,"Нал","Взаиморасчетов")+")
    |) T1
    |) T2
    |  LEFT JOIN $Справочник.Клиенты  AS Клиенты ON RIGHT(Клиент,9) = Клиенты.ID
 
   |
Так вот в переработаном запросе надо добавить поле В том числе и в это поле скидать данные по таких документах:
1. ПерезачетБартер
2. ВозвратнаяНакладная
3. ПерезачетБартерНал
4. ВозвратнаяНакладнаяН
Насколько я понимаю - тут ничего сложного вроде и нет, но, уже с час смотрю на эту задачу, как баран на новые ворота.
Где и как вставить условие по данным документа?
Честно, говоря, - ничего не понимаю. :(
 
 
   viktor_vv
 
101 - 08.01.13 - 17:43
|SELECT
            |$ДокЗП.Сотр [Сотрудник $Справочник.Сотрудники],
            |$СпрСотр.ИНН
            |FROM
            | 
            |$ДокументСтроки.ВыплатаЗП as ДокЗП (nolock)
            | inner JOIN $Справочник.Сотрудники as СпрСотр (nolock)
            |   on $ДокЗП.Сотр = СпрСотр.ID
            |";

Это чтобы было над чем пораскинуть.
   КонецЦикла
 
102 - 08.01.13 - 17:44
(92) Специально дразнишь?
Втыкай в (88) до просветления
Это же вторая строка почти такая же как первая!
Только строку или число необязательно типизировать, можно написать $СпрСотр.ИНН ИНН или $СпрСотр.ИНН МойИННДляОтчета
   bananan
 
103 - 08.01.13 - 17:55
(102) Так как в (101) - работает
   Mikeware
 
104 - 08.01.13 - 17:56
(103) так там и написано без ошибок...
   bananan
 
105 - 08.01.13 - 18:08
Вот такой текст запроса:
ТекстЗапроса = "
            |SELECT
            |$ДокЗП.Сотр [Сотрудник $Справочник.Сотрудники],
            |$СпрСотр.ДатаРождения
            |FROM
            | 
            |$ДокументСтроки.ВыплатаЗП as ДокЗП (nolock)
            | inner JOIN $Справочник.Сотрудники as СпрСотр (nolock)
            |   on $ДокЗП.Сотр = СпрСотр.ID
            |";
В ТаблицуЗначений выводятся пустые строки, т.е. ничего в Таблице значений нет! Есть только две колонки: Сотрудник и sp2291
   bananan
 
106 - 08.01.13 - 18:13
*(105) Почему запрос ничего не возвращает?
   viktor_vv
 
107 - 08.01.13 - 18:14
(105) Документы такие в базе вообще есть ?
   ЧеловекДуши
 
108 - 08.01.13 - 18:16
(106)  inner JOIN  - По гугли, что есть JOIN и с чем его едят ;)
   bananan
 
109 - 08.01.13 - 18:16
(107) Я, кажется ошибся, окно таблицы значений появилось , а в нем нет никаких данных, но в строке сатуса 1С - "выполняется обработка"
   ЧеловекДуши
 
110 - 08.01.13 - 18:18
(109)Беги... беги от туда :)
Или все же стоит быть трезвым ? ;)
 
 Рекламное место пустует
   viktor_vv
 
111 - 08.01.13 - 18:19
(108) В данном слечае по барабану. Разве что удалили элементы справочника без контроля ссылочной целостности.
   bananan
 
112 - 08.01.13 - 18:19
(110) В последний раз выпил немного вина - 15 ноября
   bananan
 
113 - 08.01.13 - 18:23
(109) Да не ошибся я Сообщить(ТЗ.КоличествоСтрок()); выдает 0!
   bananan
 
114 - 08.01.13 - 18:25
т.е. Такой код:
    ТекстОшибки = "";
    Если ФС.СуществуетФайл(ИмяФайлаXML) <> 1 Тогда
        ТекстОшибки = "Файл """ + ИмяФайлаXML + """ не найден!";
    ИначеЕсли ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1 Тогда
        ТекстОшибки = "Компонента v7plus.dll не найдена!";
    КонецЕсли;
    
    Если ПустаяСтрока(ТекстОшибки) <> 1    Тогда
        Предупреждение(ТекстОшибки);
        Возврат;
    КонецЕсли;

    
    ТекстЗапроса = "
            |SELECT
            | $ДокЗП.Сотр [Сотрудник $Справочник.Сотрудники],
            | $СпрСотр.ДатаРождения
            | ,$СпрСотр.РождГород
            |FROM
            |$ДокументСтроки.ВыплатаЗП as ДокЗП (nolock)
            | INNER JOIN $Справочник.Сотрудники as СпрСотр (nolock)
            |   ON $ДокЗП.Сотр = СпрСотр.ID
            |";

            
    Запр=СоздатьОбъект("ODBCRecordset");
    Запр.УстановитьТекстовыйПараметр("НачДата", НачДата);
    Запр.УстановитьТекстовыйПараметр("КонДата", КонДата);
    ТЗ = Запр.ВыполнитьИнструкцию(ТекстЗапроса);
    ТЗ.ВыбратьСтроку();
    Сообщить(ТЗ.КоличествоСтрок());
В таблицу значений ничего не попадает!
   bananan
 
115 - 08.01.13 - 18:27
а сообщить выдате 0
   viktor_vv
 
116 - 08.01.13 - 18:34
Выполни

ДокЗП = СоздатьОбъект("Документ.ВыплатаЗП");

Если ДокЗП.ВыбратьДокументы() = 0 Тогда
   Сообщить("Н у нету в базе документов ""Выплата ЗП""");
Иначе
   Сообщить("Таки какая-то фигня в запросе.");
КонецЕсли;
   bananan
 
117 - 08.01.13 - 18:38
(116) Блин, таки он выдал: Н у нету в базе документов "Выплата ЗП
   Mikeware
 
118 - 08.01.13 - 18:59
:-)))
   sapphire
 
119 - 09.01.13 - 04:14
(115) открой для себя UNIREPS & UNIPROC c ИТС...
   Mikeware
 
120 - 09.01.13 - 05:46
(119) а смысл? еще 100500 веток учить его ими пользоваться?
зы. по-моем, бананан - это нечто типа wiki:Теорема_о_бесконечных_обезьянах
   bananan
 
121 - 09.01.13 - 12:27
(120) Дорогой, Mikeware вы тоже от обезьяны произошли, ибо каждый судит по себе.
А по поводу документа ВыплатаЗП... Тут я НЕ ПОНИМАЮ, потому что - когда запускаю программу и Открывааю журнал Зарплаты - там есть два типа документов: Начисление ЗП и... Выплата ЗП.
Если текст запроса такой:
   |SELECT
            | $ДокЗП.Сотрудник [Сотрудник $Справочник.Сотрудники],
            | $СпрСотр.Имя AS Name
            | ,$СпрСотр.Отчество AS Отчество
            | ,$СпрСотр.Пол AS Пол
            | ,$СпрСотр.ДокСерия AS ДокСерия
            | ,$СпрСотр.ДокНомер AS ДокНомер
            | ,$СпрСотр.ДокКогдаВыдан AS ДоккогдаВыдан
            | ,$СпрСотр.ДокКемВыдан AS ДокКемВыдан
            | ,$СпрСотр.ДатаРождения AS ДатаРождения
            | ,$СпрСотр.РождГород AS РождГород
            | ,$СпрСотр.ФактАдрес AS ФактАдрес
            | ,$СпрСотр.ФактИндекс AS ФактИндекс
            | ,$СпрСотр.ДатаПриема AS ДатаПриема
            | ,$СпрСотр.ТелефонДом AS ТелефонДом
            | ,$СпрСотр.ТелефонРаб AS ТелефонРаб
            | ,$СпрСотр.КодПользователя AS КодПользователя
            |FROM
            |$ДокументСтроки.НачислениеЗП as ДокЗП (nolock)
            | INNER JOIN $Справочник.Сотрудники as СпрСотр (nolock)
            |   ON $ДокЗП.Сотрудник = СпрСотр.ID
 
Запрос работает нормально и выдает 10000 с лишним строк...
Если текст запроса такой:
|SELECT
            | $ДокЗП.Сотрудник [Сотрудник $Справочник.Сотрудники],
            | $СпрСотр.Имя AS Name
            | ,$СпрСотр.Отчество AS Отчество
            | ,$СпрСотр.Пол AS Пол
            | ,$СпрСотр.ДокСерия AS ДокСерия
            | ,$СпрСотр.ДокНомер AS ДокНомер
            | ,$СпрСотр.ДокКогдаВыдан AS ДоккогдаВыдан
            | ,$СпрСотр.ДокКемВыдан AS ДокКемВыдан
            | ,$СпрСотр.ДатаРождения AS ДатаРождения
            | ,$СпрСотр.РождГород AS РождГород
            | ,$СпрСотр.ФактАдрес AS ФактАдрес
            | ,$СпрСотр.ФактИндекс AS ФактИндекс
            | ,$СпрСотр.ДатаПриема AS ДатаПриема
            | ,$СпрСотр.ТелефонДом AS ТелефонДом
            | ,$СпрСотр.ТелефонРаб AS ТелефонРаб
            | ,$СпрСотр.КодПользователя AS КодПользователя
            |FROM
            |$ДокументСтроки.ВыплатаЗП as ДокЗП (nolock)
            | INNER JOIN $Справочник.Сотрудники as СпрСотр (nolock)
            |   ON $ДокЗП.Сотрудник = СпрСотр.ID
 
выдает ошибку:
Meta name parser error: поле таблицы не найдено "$ДокЗП.Сотрудник"
Где здесь обезьяна зарыта. увжаемый, Mikeware??
   Ёпрст
 
122 - 09.01.13 - 12:32
(121) в табличной части документа ВыплатаЗП нет реквизита Сотрудник, и всего лишь
   sapphire
 
123 - 09.01.13 - 12:36
(120) (122) Интересно, ТС вслепую запросы пишет?
т.е. глянуть дерево метаданных и посмотреть что и где лежит ему, видимо, религия не позволяет :)
   Mikeware
 
124 - 09.01.13 - 12:36
(122) Обезьяна зарыта в ДНК того, кто ищет поле Сотрудник в шапке документа ВыплатаЗП. Причем зарыта весьма неглубоко, ибо эта обезьяна упорно не читает документацию.
   bananan
 
125 - 09.01.13 - 12:37
*(121) И еще вопрос, я формирую запрос - тот что приведен первым, выполняю: ТЗ = Запр.ВыполнитьИнструкцию(ТекстЗапроса);
    ТЗ.ВыбратьСтроку();
И, я что-то не понимаю, но даю:
Сообщить("ТЗ.Name= "+ТЗ.Name+"ТЗ.Отчество="+ТЗ.Отчество);
В окне сообщений вижу:
ТЗ.Name= ТЗ.Отчество=
Я не так как нужно пытаюсь вызвать поле из таблицы значений?
(122) Добрий день, Ёпрст4, да тут дело не в том, вчера ошибки не выдавал (после того, я видимо сделал правки в коде). Так вот, до этих правок в коде - ошибки не выдавал, но и... не выдавал никаких значений! К тому же, когда запустил такой код:
ДокЗП = СоздатьОбъект("Документ.ВыплатаЗП");

Если ДокЗП.ВыбратьДокументы() = 0 Тогда
   Сообщить("Н у нету в базе документов ""Выплата ЗП""");
Иначе
   Сообщить("Таки какая-то фигня в запросе.");
КонецЕсли;
Он выдал.: Н у нету в базе документов ""Выплата ЗП""
Хотя если смотреть Журнал Зарплаты - Там документы ВыплатаЗП - есть и их там довольно много!!!!
   Mikeware
 
126 - 09.01.13 - 12:37
(123) контрол-цэ - контрол-вэ...
   Ёпрст
 
127 - 09.01.13 - 12:40
(125) смотри ВыплатаЗПБ
   Ёпрст
 
128 - 09.01.13 - 12:40
мот не тот вид документа смотришь в журнале своём
   sapphire
 
129 - 09.01.13 - 12:40
(126) Надо кусок 1cpp сделать шароварным - т.е. ответил на ряд вопросов функционал доступен, нет - ПНХ.
   Ёпрст
 
130 - 09.01.13 - 12:41
по-поводу (121)

у тебя есть Сотр, а не Сотрудник в ТЧ дока.
   bananan
 
131 - 09.01.13 - 12:42
Ну забыл я, что в ВыплатаЗП это поле назхывается Сотр.
Запрос:
|SELECT
            | $ДокЗП.Сотр [Сотрудник $Справочник.Сотрудники],
            | $СпрСотр.Имя AS Name
            | ,$СпрСотр.Отчество AS Отчество
            | ,$СпрСотр.Пол AS Пол
            | ,$СпрСотр.ДокСерия AS ДокСерия
            | ,$СпрСотр.ДокНомер AS ДокНомер
            | ,$СпрСотр.ДокКогдаВыдан AS ДоккогдаВыдан
            | ,$СпрСотр.ДокКемВыдан AS ДокКемВыдан
            | ,$СпрСотр.ДатаРождения AS ДатаРождения
            | ,$СпрСотр.РождГород AS РождГород
            | ,$СпрСотр.ФактАдрес AS ФактАдрес
            | ,$СпрСотр.ФактИндекс AS ФактИндекс
            | ,$СпрСотр.ДатаПриема AS ДатаПриема
            | ,$СпрСотр.ТелефонДом AS ТелефонДом
            | ,$СпрСотр.ТелефонРаб AS ТелефонРаб
            | ,$СпрСотр.КодПользователя AS КодПользователя
            |FROM
            |$ДокументСтроки.ВыплатаЗП as ДокЗП (nolock)
            | INNER JOIN $Справочник.Сотрудники as СпрСотр (nolock)
            |   ON $ДокЗП.Сотр = СпрСотр.ID
 
Не выдает ничего!!! Почему::
(127) мне нужно в запросе ВыплатаЗП, а не ВыплатаЗПБ
   Ёпрст
 
132 - 09.01.13 - 12:44
(131) ну нет таких документов в базе и привет.
Смотри, какой еще документ имеет такой же синоним (это то, что ты в журнальчике своём видишь потом)
   bananan
 
133 - 09.01.13 - 12:47
(132) смотрю в конфигупаторе документ ВыплатаЗП:
Синоним: Выплата ЗП, что мне программа и показывает, а ЗАПРОС документов ВыплатаЗП НЕ ВИДИТ. Почему?
 
 
   Mikeware
 
134 - 09.01.13 - 12:48
(132) не, ну каково тебе (133)? :-)))
   Ёпрст
 
135 - 09.01.13 - 12:49
(133) это же очевидно - Сотр в документе имеет тип НЕ
Справочник.Сотрудники.

Вот при inner join у тебя и пусто
   Ёпрст
 
136 - 09.01.13 - 12:49
(134) :)
   Ёпрст
 
137 - 09.01.13 - 12:50
у меня есть его md. мне проще 
:)
   bananan
 
138 - 09.01.13 - 12:51
*(133)    Ёпрст4 - как всегда прав. Документ ВыплатаЗПБ тоже имеет синоним Выплата ЗП!
еще один ну очень маленький вопрос. Как мне сообщить какую-то ячеку из таблицы значений?
Такой код:
Сообщить("ТЗ.Name= "+ТЗ.Name+"ТЗ.Отчество="+ТЗ.Отчество);
Выдает:
ТЗ.Name= ТЗ.Отчество=
   Ёпрст
 
139 - 09.01.13 - 12:57
ТЗ.ПолучитьСтрокуПоНомеру(1);//или какая там тебя строка интересует ?
   monsterZE
 
140 - 09.01.13 - 12:58
выбратьСтроки
пока получитьСтроку()=1 цикл
..
   Mikeware
 
141 - 09.01.13 - 12:58
(138) или ВыбратьСтроку()
а вообще, вопрос уже за грань добра и зла...
   sapphire
 
142 - 09.01.13 - 12:59
(137) счастливый обладатель md-шника :D
   viktor_vv
 
143 - 09.01.13 - 13:00
(137) Так ты читер :)).
   Mikeware
 
144 - 09.01.13 - 13:02
(142) заветного эмдэшника :-)
   bananan
 
145 - 09.01.13 - 13:03
Все большое спасибо! Отдельное спасибо Ёпрст4!
   КонецЦикла
 
146 - 09.01.13 - 13:29
(137) :)
Подключись через МД и всоси в автора ЗНАНИЕ
   Mikeware
 
147 - 09.01.13 - 13:30
(146) автору надо не "всосать", а "вдуть"...
   sapphire
 
148 - 09.01.13 - 13:33
(147) Он еще #ЗагрузитьИзФайла не освоил? :)
  1  2

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует