Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) dbf Получение остатков из регистров остатков, (число прочтений - 6108 )
evy16ni16
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Августа 2010
dbf Получение остатков из регистров остатков,
21. Марта 2011 :: 08:34
Печать  
Здравствуйте. Нужно получить остатки в dbf из регистра ОстаткиТМЦ(Фирма,Номенклатура,Склад,количество ) на произвольную дату. Пытаюсь построить для начала запрос к остаткам на начало месяца, обороты пока не трогаю, не получается, на ТА получается а на дату нет, вот код
[code]
db = СоздатьОбъект("OLEDBData");
     глСтрокаПрямогоПодключенияКБД = Шаблон ("Provider=VFPOLEDB.1; Mode=ReadWrite;
          |Data Source=[КаталогИБ ()];");
     Рез = db.Соединение(глСтрокаПрямогоПодключенияКБД);
     cmd = db.СоздатьКоманду(); // здесь получаем экземпляр класса "OLEDBCommand"
     cmd.Отладка(1);//0-отключить, по умолчанию отладка отключена

     ТекстЗапроса  ="
  |Select
  |  $рег.Фирма As [Фирма $Справочник.Фирмы],
  |  $рег.Номенклатура As [Номенклатура $Справочник.Номенклатура],
  |  $рег.Склад As [Склад $Справочник.Склады],
  |  $рег.Количество as Количество
  |From
  |  $Регистр.ОстаткиТМЦ as рег
  | WHERE
  |     рег.PERIOD = @PERIODR
|";  
  cmd.УстановитьТекстовыйПараметр("PERIODR",НачМесяца(наДату));

ТЗ = cmd.ВыполнитьИнструкцию(ТекстЗапроса);
     cmd.Закрыть();
     
     db.Закрыть();
     Возврат ТЗ;
[/code]

P.S. Готовый пример видел здесь: script-coding.com/v77tables.html#3.4.2.4. , но он во первых у меня не работает, а во вторых, хотелось бы разобраться с основ так сказать.

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: dbf Получение остатков из регистров остатков,
Ответ #1 - 21. Марта 2011 :: 08:45
Печать  
все примеры есть вот тут:
http://www.1cpp.ru/forumfiles/Attachments/mod_002.zip

для дбф, если не предпололагается запрос к внешней базе или update/insert/delete проще использовать
1sqlite..
http://www.1cpp.ru/forum/YaBB.pl?num=1214205575

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


I Love YaBB 2!

Сообщений: 313
Зарегистрирован: 24. Декабря 2007
Re: dbf Получение остатков из регистров остатков,
Ответ #2 - 21. Марта 2011 :: 09:03
Печать  
Код
Выбрать все
	ТекстЗапроса  ="
   |Select
   |  $рег.Фирма As [Фирма $Справочник.Фирмы],
   |  $рег.Номенклатура As [Номенклатура $Справочник.Номенклатура],
   |  $рег.Склад As [Склад $Справочник.Склады],
   |  $рег.Количество as Количество
   |From
   |  $Регистр.ОстаткиТМЦ as рег
   | WHERE
   |     рег.PERIOD = :PERIODR~~
|";
   cmd.УстановитьТекстовыйПараметр("PERIODR",ДобавитьМесяц(НачМесяца(наДату),-1));
 

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: dbf Получение остатков из регистров остатков,
Ответ #3 - 21. Марта 2011 :: 09:10
Печать  
kriblya писал(а) 21. Марта 2011 :: 09:03:
cmd.УстановитьТекстовыйПараметр("PERIODR",ДобавитьМесяц(НачМесяца(наДату),-1));

Это не всегда будет работать.
Более правильный вариант описан в ответе на мой вопрос.
  
Наверх
 
IP записан
 
kriblya
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 313
Зарегистрирован: 24. Декабря 2007
Re: dbf Получение остатков из регистров остатков,
Ответ #4 - 21. Марта 2011 :: 09:13
Печать  
Согласен.
но 90% не меняют периодичность.
и в примере запроса стоит НачМесяца(), соответственно период = месяц
  
Наверх
 
IP записан
 
evy16ni16
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Августа 2010
Re: dbf Получение остатков из регистров остатков,
Ответ #5 - 21. Марта 2011 :: 09:35
Печать  
Вроде как получилось, через отбор по индексу, 1sqlite пока не смотрел, но раз проще, буду в ту сторону потихоньку прорыватьсяУлыбка,
и еще подскажите, Выполнил я инструкцию, выгрузил в тз, смотрю в нее, а там номенклатура имеет строковой вид типа  "    1W   ", значениеизСтроки и изСтрокиВнутр ничего не дает, что с этой строкой надо то делать?Улыбка
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: dbf Получение остатков из регистров остатков,
Ответ #6 - 21. Марта 2011 :: 09:51
Печать  
evy16ni16 писал(а) 21. Марта 2011 :: 09:35:
Выполнил я инструкцию, выгрузил в тз, смотрю в нее, а там номенклатура имеет строковой вид типа  "    1W   ", значениеизСтроки и изСтрокиВнутр ничего не дает, что с этой строкой надо то делать?Улыбка


Это при типизации [Номенклатура $Справочник.Номенклатура]
тебе такое даёт ?

А в регистре,измерение  "Номенклатура"  какой тип имеет у тебя ?
  
Наверх
 
IP записан
 
evy16ni16
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Августа 2010
Re: dbf Получение остатков из регистров остатков,
Ответ #7 - 21. Марта 2011 :: 10:03
Печать  
Спасибо, типизация помоглаУлыбка
  
Наверх
 
IP записан
 
evy16ni16
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Августа 2010
Re: dbf Получение остатков из регистров остатков,
Ответ #8 - 23. Марта 2011 :: 13:49
Печать  
Подскажите еще, почему то у меня сортировка, сделанная таким образом, никак не сортирует?
Код
Выбрать все
|Order By $РегОстатков.Номенклатура desc;
|Order By $РегОстатков.Номенклатура asc;
 

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: dbf Получение остатков из регистров остатков,
Ответ #9 - 23. Марта 2011 :: 13:55
Печать  
сам то понял что написал ?

первое - сортировка по id вряд ли тебе чем то поможет
второе - использовать в одном запросе desc и asc к одному полю.. как то не комильфо..Улыбка

ЗЫ: а так, левое соедиенние со справочником номенклатура и
Order By Спр.desc --сортировка по наименованию справочника
  
Наверх
 
IP записан
 
evy16ni16
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Августа 2010
Re: dbf Получение остатков из регистров остатков,
Ответ #10 - 23. Марта 2011 :: 14:08
Печать  
1)А зачем делать соединение с номенклатурой, у меня же она и так есть в списке?
2)Есвенно я делал сначало по возростанию, а потом по убыванию пробывалУлыбка
3)А примерно так написать нельзя? зачем сотни не нужных запросов делать?
|Order By $РегОстатков.Номенклатура.Наименование;
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: dbf Получение остатков из регистров остатков,
Ответ #11 - 23. Марта 2011 :: 14:26
Печать  
evy16ni16 писал(а) 23. Марта 2011 :: 14:08:
1)А зачем делать соединение с номенклатурой, у меня же она и так есть в списке?
2)Есвенно я делал сначало по возростанию, а потом по убыванию пробывалУлыбка
3)А примерно так написать нельзя? зачем сотни не нужных запросов делать?
|Order By $РегОстатков.Номенклатура.Наименование;


1. у тебя в  $РегОстатков.Номенклатура - id элемента, конкретно, строка из 9 символов...
чтоб поиметь наименование, ты должен в табличке справочника найти этот id и поиметь descr (descr - в этом поле "лежит" наименование элемента справочника)
2. нельзя, см. п.1

ЗЫ: ознакомься со структурой хранения объектов, для начала..
Потом таких вопросов больше не будет возникать:

http://www.script-coding.com/v77tables.html
  
Наверх
 
IP записан
 
evy16ni16
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Августа 2010
Re: dbf Получение остатков из регистров остатков,
Ответ #12 - 23. Марта 2011 :: 16:24
Печать  
А, все понял, вроде как. И еще подскажите по получению оборотов
Код
Выбрать все
	ТекстЗапроса = "
	|SELECT
	|    Рег.Товар as [Товар $Справочник.Номенклатура],
	|    Рег.КоличествоНачальныйОстаток as КоличествоНачОст,
	|    Рег.КоличествоПриход as КоличествоПриход,
	|    Рег.КоличествоРасход as КоличествоРасход,
	|    Рег.КоличествоКонечныйОстаток as КоличествоКонОст,
	|    Рег.СуммаНачальныйОстаток as СуммаНачОст,
	|    Рег.СуммаПриход as СуммаПриход,
	|    Рег.СуммаРасход as СуммаРасход,
	|    Рег.СуммаКонечныйОстаток as СуммаКонОст,
	|FROM
	|    $РегистрОстаткиОбороты.ОстаткиТМЦ(:НачДата, :КонДата~,,,
	|					   Склад = :ВыбСклад,
	|					   (Товар), ( Количество)) as Рег";
 


Ругается на Meta name parser error: недопустимое значение параметра "$РегистрОстаткиОбороты.ОстаткиТМЦ" (7)
Или в dbf нельзя таким образом обращаться к оборота?

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: dbf Получение остатков из регистров остатков,
Ответ #13 - 24. Марта 2011 :: 07:10
Печать  
для дбф виртуальные таблицы, типа Остатки,Обороты,ОстаткиИОбороты не реализованы.

Нужно либо "руками" писать запрос (пример есть в FAQ и в статье про прямые запросы)

либо взять готовый класс Прямой запрос в репозитарии - там есть.
  
Наверх
 
IP записан
 
evy16ni16
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Августа 2010
Re: dbf Получение остатков из регистров остатков,
Ответ #14 - 24. Марта 2011 :: 08:24
Печать  
Пробую написать развернута, не совсем могу понять как брать Приход, Расход, и КонОст.
получается в первом селекте, я получаю начальный остаток, а во втором приходи и расход, но у меня почему то нули везде кроме как в начальном остатке.

[code]
ТекстЗапроса = "
|SELECT  
//|            СпрНоменклатура.descr as НаименованиеНом,
//|            СпрФирмы.descr as НаименованиеФирмы,
|    Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
|    Рег.Фирма as [Фирма $Справочник.Фирмы],
|    Рег.Склад as [Склад $Справочник.Склады],
//|    SUM(Рег.КоличествоОстаток) as Количество,
|    SUM(Рег.НачОст) as НачОст,
|    SUM(Рег.Приход) as Приход,
|    SUM(Рег.Расход) as Расход,
|    SUM(Рег.КонОст) as КонОст
|FROM
|    (SELECT
|        $Р.Номенклатура AS Номенклатура,
|           $Р.Фирма AS Фирма,
|           $Р.Склад AS Склад,
//      |        $Р.Количество AS КоличествоОстаток,
|        $Р.Количество AS НачОст,
|        0 AS Приход,
|        0 AS Расход,
|        0 AS КонОст
|    FROM
|        $РегистрИтоги.ОстаткиТМЦ as Р
|    WHERE
|        (period = :ПредМесяц~~)
//|        AND ($Р.Склад=:ВыбСклад)
|
|    UNION ALL
|
|    SELECT
|        $Р.Номенклатура AS Номенклатура,
|           $Р.Фирма AS Фирма,
|           $Р.Склад AS Склад,
//      |        $Р.Количество * (1 - Р.debkred * 2) AS КоличествоОстаток,
|        0 AS НачОст,
|        0 AS Приход,
|        0 AS Расход,
|        $Р.Количество * (1 - Р.debkred * 2) AS КонОст
|    FROM
|        $Регистр.ОстаткиТМЦ AS Р
|    INNER JOIN
|        1sjourn jr ON Р.iddoc = jr.iddoc
|            AND (jr.date BETWEEN :НачалоМесяца~~ ND :ПредДата~~)
     |            AND ($ФлагРегистра.ОстаткиТМЦ = 1)
//|    WHERE
//      |        ($Р.Склад=:ВыбСклад)
|    ) Рег
//|            LEFT JOIN $Справочник.Номенклатура As СпрНоменклатура ON СпрНоменклатура.ID = Рег.Номенклатура
//|            LEFT JOIN $Справочник.Фирмы As СпрФирмы ON СпрФирмы.ID = Рег.Фирма
|GROUP BY
|    Номенклатура,Фирма,Склад";
     //одиночные параметры
cmd.УстановитьТекстовыйПараметр("ПредМесяц",(НачМесяца(НачДата)));
cmd.УстановитьТекстовыйПараметр("ПредДата",(НачДата - 1));
cmd.УстановитьТекстовыйПараметр("НачалоМесяца",НачМесяца(НачДата));


cmd.УстановитьТекстовыйПараметр("НачДата",НачДата);
cmd.УстановитьТекстовыйПараметр("КонДата",КонДата);
//cmd.УстановитьТекстовыйПараметр("выбФирма",выбФирма);
cmd.УстановитьТекстовыйПараметр("ВыбСклад",выбСклад);      
     //одиночки
     
ТЗ = cmd.ВыполнитьИнструкцию(ТекстЗапроса);
cmd.Закрыть();

[/code]
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать