Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Помогите с 1sqlite (число прочтений - 6126 )
1st
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Помогите с 1sqlite
07. Апреля 2011 :: 07:26
Печать  
Пишу запрос.
Нужно: получить счета (ЗаявкаПокупателя) за указанный период.
Получаю, все отлично.
Дальше нужно получить все реализации, основанием которых являются выбранные заявки.
И тут проблема.
В поле ДокОснование документа Реализация лежит не ИД Документа Заявки, а 4 символа ИД вида документа и затем только ИД документа.
Соответственно, просто передать туда список заявок и проверять входит ли туда ДокОснование не катит.
Пробовал:
1) Подставлять в список к ИД Документа ИД вида документа (" 1W9  " + СокрЛП(Заявки.Док) + "    "). Если передаешь единичный параметр, все работает. Как только пихаешь все это в список, нифига не получается. Пытался уложить в ТЗ и пихнуть туда ТЗ, ругается.
базаДанных.УложитьТЗ(ТаблицаЗаявок,"ТЗаявок");
запросБД.Подготовить(ТекстЗапроса);      
Реализации=запросБД.Выполнить();
... ДокОснование in ТЗаявок
говорит "no such table ТЗаявок"
2) Думал резать от ДокОснования ИД документа и проверять его вхождение в список. Но непойму какие методы нужно использовать
right(ДокОснование,4) - ругается, говорит  near "(": syntax error
3) Можно конечно перебирать список заявок, делать запрос в цикле и пихать туда единичные склеенные вручную значения, но выполняется тогда очень долго.
Помогите плиз, второй день мучаюсь, хз че делать(
  
Наверх
 
IP записан
 
1st
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Re: Помогите с 1sqlite
Ответ #1 - 07. Апреля 2011 :: 08:47
Печать  
ап
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Помогите с 1sqlite
Ответ #2 - 07. Апреля 2011 :: 09:09
Печать  
Текст запроса сильно бы помог..
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите с 1sqlite
Ответ #3 - 07. Апреля 2011 :: 09:11
Печать  
(0) Посмотри как работают УложитьСписокОбъектов
и/или УложитьСписокОбъектов13
  
Наверх
 
IP записан
 
1st
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Re: Помогите с 1sqlite
Ответ #4 - 07. Апреля 2011 :: 09:50
Печать  
запросБД = базаДанных.НовыйЗапрос();
           
           ТекстЗапроса = "SELECT
           |Журнал.iddoc [Док: Документ.Реализация]
           |From Документ_Реализация as Реал
           |left join Журнал
           |ON Журнал.IDDOC = Реал.IDDOC
           |Where ДокОснование = @Идент";
           
           запросБД.Подготовить(ТекстЗапроса);      
           Идент = " 1W9  " + СокрЛП(Заявки.Док) + "    ";
ЗапросБД.УстановитьПараметр("@Идент",Идент,0);
                 Реализации=запросБД.Выполнить();

Это то как работает сейчас в цикле по таблице заявок.
Если я формирую список заявок по аналогии, формирую запрос не в цикле по единичным значениям, а по списку, ничего не получается.
           
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите с 1sqlite
Ответ #5 - 07. Апреля 2011 :: 10:49
Печать  
(4) поробуй так
Код
Выбрать все
ТекстЗапроса = "SELECT
	     |Журнал.iddoc [Док: Документ.Реализация]
	     |From Документ_Реализация as Реал
	     |inner join Журнал
	     |ON Журнал.IDDOC = Реал.IDDOC
	     |Where ДокОснование = :Зн_Док~";

запросБД.УстановитьТекстовыйПараметр("Зн_Док",Заявки.Док);
ТЗ =ЗапросБД.ВыполнитьИнструкцию(ТекстЗапроса);
ТЗ.ВыбратьСтроку();
 

  
Наверх
 
IP записан
 
Anatol
Senior Member
****
Отсутствует


тыц, пыц, тыц!!!

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Помогите с 1sqlite
Ответ #6 - 07. Апреля 2011 :: 10:49
Печать  
1st писал(а) 07. Апреля 2011 :: 09:50:
           Идент = " 1W9  " + СокрЛП(Заявки.Док) + "    ";

           


Ужас
  
Наверх
wwwICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с 1sqlite
Ответ #7 - 07. Апреля 2011 :: 10:56
Печать  
Код
Выбрать все
база = СоздатьОбъект("SQLiteBase");
база.Открыть(":memory:");
Запрос = база.НовыйЗапрос();
Запрос.ВыполнитьЗапрос("PRAGMA journal_mode = OFF");

ТекстЗапроса = "
|Select
|   Док.iddoc [Док :Документ.Реализация]
|From  [Документ.Реализация] Док
|inner join [Журнал] Жур on Жур.iddoc = Док.iddoc
|  and Жур.date between :НачДата and :КонДата
|  and Жур.iddocdef = :ВидДокумента.Реализация
|Where  substr(Док.ДокОснование,5,9) in (select val from СписокДокументов)
|";

//СписокДокументов - твой список с документиками
база.УложитьОбъекты(СписокДокументов,"СписокДокументов",0);
Запрос.Подставлять("НачДата ",НачДата);
Запрос.Подставлять("КонДата",КонДата);
//запрос.Отладка(1);
ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса);
ТЗ.ВыбратьСтроку(); 




  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с 1sqlite
Ответ #8 - 07. Апреля 2011 :: 10:59
Печать  
Z1 писал(а) 07. Апреля 2011 :: 10:49:
(4) поробуй так


у него 1sqlite, там немного другой синтаксис..

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


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Re: Помогите с 1sqlite
Ответ #9 - 07. Апреля 2011 :: 11:44
Печать  
(7)
Сяб, блин как я сам не допер, видел же этот метод даже описание читал)
Но проблема осталась)
Если делаю так:
запросБД = базаДанных.НовыйЗапрос();
           
           ТекстЗапроса = "SELECT
           |Журнал.iddoc [Док: Документ.Реализация]
           |From Документ_Реализация as Реал
           |left join Журнал
           |ON Журнал.IDDOC = Реал.IDDOC
           |Where substr(trim(ДокОснование),6,4) = @Заявка";
           
           запросБД.Подготовить(ТекстЗапроса);      
           Заявка = СписокЗаявок.ПолучитьЗначение(1);
           запросБД.УстановитьПараметр("@Заявка",Заявка,0);
     
                 Реализации=запросБД.Выполнить();

Все работает зашибись.
Если так:
запросБД = базаДанных.НовыйЗапрос();
           
           ТекстЗапроса = "SELECT
           |Журнал.iddoc [Док: Документ.Реализация]      
           |From Документ_Реализация as Реал
           |left join Журнал
           |ON Журнал.IDDOC = Реал.IDDOC
           |Where substr(trim(ДокОснование),6,4) in СписокЗаявок";
     
           базаДанных.УложитьОбъекты(СписокЗаявок,"СписокЗаявок");
           запросБД.Подготовить(ТекстЗапроса);      
           Реализации=запросБД.Выполнить();

нифига не находит.
((((
Проблема явно в списке. Может с ТЗ получиться?
Слушай, а подскажи, что я не так делаю с укладкой ТЗ?:

запросБД = базаДанных.НовыйЗапрос();
           
           ТекстЗапроса = "SELECT
           |Журнал.iddoc [Док: Документ.Реализация]      
           |From Документ_Реализация as Реал
           |left join Журнал
           |ON Журнал.IDDOC = Реал.IDDOC
           |Where substr(trim(ДокОснование),6,4) in ТаблицаЗаявок";
     
           базаДанных.УложитьТЗ(ТаблицаЗаявок,"ТаблицаЗаявок");
           запросБД.Подготовить(ТекстЗапроса);      
           Реализации=запросБД.Выполнить();      

Говорит no such table ТаблицаЗаявок
           
(5)
Так это же единичный тоже параметр я правильно понимаю?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с 1sqlite
Ответ #10 - 07. Апреля 2011 :: 11:51
Печать  
1. Нафига тебе ПОдготовить ?
Ты чего, параметрический запрос выполняешь ?
Он у тебя в цикле что ли ? Или потом с другими параметрами выполняется ?
2. я тебе дал рабочий вариант, тебе всего лишь

//СписокДокументов - твой список с документиками
вот это сделать

СписокДокументов - СоздатьОбъект("СписокЗначений");
....

СписокДокументов.ДобавитьЗначение(Документик.ТекущийДокумент());

т.е заполнить свой список нужными документами - основаниями.


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


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Re: Помогите с 1sqlite
Ответ #11 - 07. Апреля 2011 :: 12:25
Печать  
Не получаецца нифига)
  

_______006.jpg ( 135 KB | Загрузки )
_______006.jpg
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с 1sqlite
Ответ #12 - 07. Апреля 2011 :: 12:31
Печать  
Ты это, издеваешься, или как ?
И еще, нафига делать 2 запроса, когда проще всё сделать сразу в одном.
ЗЫ: а вообще зачетно делать left join к журналу документов и рассчитывать на условие по дате.
  
Наверх
 
IP записан
 
1st
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Re: Помогите с 1sqlite
Ответ #13 - 07. Апреля 2011 :: 12:38
Печать  
А что не так то?
Все один в один как у тебя)
  
Наверх
 
IP записан
 
1st
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Re: Помогите с 1sqlite
Ответ #14 - 07. Апреля 2011 :: 12:41
Печать  
У тебя работает тот код который ты скинул?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с 1sqlite
Ответ #15 - 07. Апреля 2011 :: 12:51
Печать  
1st писал(а) 07. Апреля 2011 :: 12:38:
А что не так то?
Все один в один как у тебя)


да уж..
еще раз внимательнее посмотри.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите с 1sqlite
Ответ #16 - 07. Апреля 2011 :: 12:55
Печать  
1st писал(а) 07. Апреля 2011 :: 12:38:
А что не так то?
Все один в один как у тебя)

интервал дат наоборот
а то у тебя получается НачДата > КонДаны

Вместо двух запросов нужен один запрос
и вместо left join пиши inner join
Добейся чтобы у тебя запрос заработал без условия на ДокОснование
Потом добавь это условие.
  
Наверх
 
IP записан
 
1st
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Re: Помогите с 1sqlite
Ответ #17 - 07. Апреля 2011 :: 13:11
Печать  
Заработало!)))
Огромное спасибо)
Очень довольный
база = СоздатьОбъект("SQLiteBase");
     база.Открыть(":memory:");
     Запрос = база.НовыйЗапрос();
     Запрос.ВыполнитьЗапрос("PRAGMA journal_mode = OFF");
     
     ТекстЗапроса = "
     |Select
     |   Реал.iddoc [Док :Документ.Реализация],
     |      Заявка.iddoc [ДокОснование: Документ.ЗаявкаПокупателя]
     |From  [Документ.ЗаявкаПокупателя] Заявка
     |inner join [Журнал] Жур on Жур.iddoc = Заявка.iddoc
     |  and Жур.date between :НачДата and :КонДата
     |inner join [Документ.Реализация] Реал
     |on substr(Реал.ДокОснование,5,9) = Заявка.iddoc
     |";
     
     //СписокДокументов - твой список с документиками
     //база.УложитьОбъекты(СписокДокументов,"СписокДокументов",0);
     Запрос.Подставлять("НачДата",НачДата);
     Запрос.Подставлять("КонДата",КонДата);
     
     ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса);
     ТЗ.ВыбратьСтроку();
  
Наверх
 
IP записан
 
1st
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Re: Помогите с 1sqlite
Ответ #18 - 07. Апреля 2011 :: 13:12
Печать  
А что это значит и зачем оно нужно?:
Запрос.ВыполнитьЗапрос("PRAGMA journal_mode = OFF");
Без этого все отлично тоже работает)
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с 1sqlite
Ответ #19 - 07. Апреля 2011 :: 13:17
Печать  
1st писал(а) 07. Апреля 2011 :: 13:12:
А что это значит и зачем оно нужно?:
Запрос.ВыполнитьЗапрос("PRAGMA journal_mode = OFF");
Без этого все отлично тоже работает)


отключает журналирование
http://www.sqlite.org/pragma.html#pragma_journal_mode
  
Наверх
 
IP записан
 
1st
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Re: Помогите с 1sqlite
Ответ #20 - 07. Апреля 2011 :: 13:38
Печать  
Без условия работало все отлично.
И с уловием с единичными параметрами тоже все работало зашибись. проблема была в том что когда в список значений пихаешь, значения по ходу как то преобразовывались, или искались как то не так.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать