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


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Августа 2010
Re: dbf Получение остатков из регистров остатков,
Ответ #15 - 24. Марта 2011 :: 08:26
Печать  
И еще такой вопрос, если допустим я хочу получить данные с середины одного месяца до середины другово например, мне что получается, надо
1)Получить остатки на начало первого месяца
2)Прибавить обороты за первую половину, чтобы получить начОст
3)прибавить обороты за период?
  
Наверх
 
IP записан
 
evy16ni16
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Августа 2010
Re: dbf Получение остатков из регистров остатков,
Ответ #16 - 24. Марта 2011 :: 08:47
Печать  
Если сделать вот так
Код
Выбрать все
ТекстЗапроса = "
	|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 НачОст,
	|        ($Р.Количество * (1 - (Р.DEBKRED+1)%2)) AS Приход,
	|        ($Р.Количество * (Р.debkred)) AS Расход,
	|        0 AS КонОст
	|    FROM
	|        $Регистр.ОстаткиТМЦ AS Р
	|    INNER JOIN
	|        1sjourn jr ON Р.iddoc = jr.iddoc
//	|            AND (jr.date BETWEEN :НачалоМесяца~~ AND :ПредДата~~)
//	|            AND ($ФлагРегистра.ОстаткиТМЦ = 1)
	//|    WHERE
//	|        ($Р.Склад=:ВыбСклад)
	|    ) Рег
	//|		LEFT JOIN $Справочник.Номенклатура As СпрНоменклатура ON СпрНоменклатура.ID = Рег.Номенклатура
	//|		LEFT JOIN $Справочник.Фирмы As СпрФирмы ON СпрФирмы.ID = Рег.Фирма
	|GROUP BY
	|    Номенклатура,Фирма,Склад";
 


То какие то обороты, выводит, то есть у меня как то не так задан период в джойне к журналу документов
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: dbf Получение остатков из регистров остатков,
Ответ #17 - 24. Марта 2011 :: 09:19
Печать  
галка быстрая обработка движений, или флаг отбора движений на любом из измерений/реквизитов стоит в регистре у тебя ?

А так, запрос у тебя не верный.

Для получения останков(не важно, КонОст или НачОст) ты должен взять итоги с таблички итогов, где Период = предыдущей дате начала хранения останков + прибавить движения из таблички движений от текущей даты начала хранения останков до нужной даты.

Для получения прихода/расхода ты должен просто взять строчки из таблички движений между выбранными датами.

Если нужен КонОст на ТА, то для получения останков достаточно прросто взять строчки с таблички итогов регистра, где период =
текущей дате начала периодичности хранения останков.
  
Наверх
 
IP записан
 
evy16ni16
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Августа 2010
Re: dbf Получение остатков из регистров остатков,
Ответ #18 - 24. Марта 2011 :: 09:28
Печать  
Пробывал и с галкой и без галки, один результат
  
Наверх
 
IP записан
 
evy16ni16
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Августа 2010
Re: dbf Получение остатков из регистров остатков,
Ответ #19 - 24. Марта 2011 :: 09:33
Печать  
Ну допустим НаЧОст на 01.03.11. Это что надо взять Остаток на 1 февраля
Если на 5 марта, то  остаток на 1 февраля + обороты за 1-5 марта так?
  
Наверх
 
IP записан
 
evy16ni16
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Августа 2010
Re: dbf Получение остатков из регистров остатков,
Ответ #20 - 24. Марта 2011 :: 09:44
Печать  
--Для получения прихода/расхода ты должен просто взять строчки из таблички движений между выбранными датами.

Не получается, нули выводит, если между датами, если отбор по датам не ставить то какие то оборты выводит.

По начОст, конОст учту замечание.
Код
Выбрать все
|    SELECT
|	  $Р.Номенклатура AS Номенклатура,
|	     $Р.Фирма AS Фирма,
|	     $Р.Склад AS Склад,
|	  0 AS НачОст,
|	  ($Р.Количество * (1 - (Р.DEBKRED+1)%2)) AS Приход,
|	  ($Р.Количество * (Р.debkred)) AS Расход,
|	  0 AS КонОст
|    FROM
|	  $Регистр.ОстаткиТМЦ AS Р
|    INNER JOIN
|	  1sjourn jr ON Р.iddoc = jr.iddoc
	|		AND (jr.date BETWEEN :НачалоМесяца~~ AND :ПредДата~~)
 

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



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

ЗЫ: фирму сам добавишь (у меня её нет, она в реквизитах болтается у меня..)
  

_________001.ert ( 104 KB | Загрузки )
Наверх
 
IP записан
 
evy16ni16
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Августа 2010
Re: dbf Получение остатков из регистров остатков,
Ответ #22 - 24. Марта 2011 :: 10:17
Печать  
Спасибки, работаетУлыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать