Имя: Пароль:
1C
1C 7.7
v7: Загрузка из DBF
,
0 DeMi4
 
09.11.11
11:45
Есть файл DBF в котором проиндексирован файл MOL. Для каждого МОЛ есть номенклатура ну три или 10 записей из этого файла надо создать документ Ввод остатков делаю так:

ДокВвОст=СоздатьОбъект("Документ.ВводОстатковТМЦ");
Файл=СоздатьОбъект("XBASE");
Файл.ОткрытьФайл("d:\Work1C\Partii2.DBF","d:\Work1C\Partii2.CDX");
Если Файл.Открыта()=0 Тогда
    Сообщить ("Не удалось открыть файл");
КонецЕсли;
Файл.КодоваяСтраница(1);
Файл.Первая();
Индекс=Файл.ТекущийИндекс("IDMOL");
Пока Файл.ВКонце()=0 Цикл
   Если Файл.MOL=Индекс Тогда
       Сообщить(Файл.MOL);
   КонецЕсли;
   Сообщить(""+Файл.NOMEN+" "+Файл.KOL+" "+Файл.SUMMARUB);
КонецЦикла;
Файл.ЗакрытьФайл();

Что неправильно?
1 ДенисЧ
 
09.11.11
11:46
а что неправильно?
2 DeMi4
 
09.11.11
11:47
Такое чувство что виснет. Несколько записей выведет и все
3 ДенисЧ
 
09.11.11
11:48
А где Следующая() ?
4 DeMi4
 
09.11.11
11:52
Как для определенного индекса сделать выгрузку в ТЗ
На ум кроме цикла в цикле ни чего не приходит
5 Ёпрст
 
09.11.11
11:58
(4) забить на xbase, написать прямой запрос к файлу через фоксовый провайдер, в нём - сделать что угодно и как угодно.
6 Dump
 
09.11.11
12:09
С индексами не работал. Всегда загружаю из ДБФ в ТЗ, потом с ТЗ делац что хочешь - сортируй, фильтруй, сворачивай...
7 Mikeware
 
09.11.11
12:19
(1) вот это неправильно:
Индекс=Файл.ТекущийИндекс("IDMOL");
Пока Файл.ВКонце()=0 Цикл
   Если Файл.MOL=Индекс Тогда
8 Mikeware
 
09.11.11
12:20
(5) Ну куда ему еще и прямые запросы...
9 DeMi4
 
09.11.11
12:22
Согласен что это неправильно
Как мне для ндекса получить список номенклатуры
10 FF
 
09.11.11
12:27
зависает, потому что в цикле нет Файл.Следующая()
11 Dump
 
09.11.11
12:30
ДБФЗАР=СоздатьОбъект("XBase");
....
   Для СчЗаписейЗар=1 По ДБФЗАР.КоличествоЗаписей() Цикл
       ДБФЗАР.Перейти(СчЗаписейЗар);
       ТЗН.НоваяСтрока();
   ТЗН.Номенкл=ДБФЗАР.ПолучитьЗначениеПоля("Nomenkl");
.....
   КонецЦикла;      
   ДБФЗАР.ЗакрытьФайл();
12 miki
 
09.11.11
12:33
(9)у тебя индекс с фильтром?
13 DeMi4
 
09.11.11
12:34
Без индекса
14 DeMi4
 
09.11.11
12:35
Без фильтра
15 СвинТуз
 
09.11.11
12:37
Файл.Первая();
Индекс=Файл.ТекущийИндекс("IDMOL");

гы
переставить попробуй
16 miki
 
09.11.11
12:37
(14)тогда опиши просто словами алгоритм что и как ты хочешь получить от использования индекса?
17 Dump
 
09.11.11
12:48
(16) Похоже, ты задал самый сложный вопрос в этой ветке ;-)
18 DeMi4
 
09.11.11
12:57
Для каждого склада надо необходимо определить номенклатуру
19 Mikeware
 
09.11.11
12:58
(11) 1986?
(15) А почти без разницы. Ему все равно позиционироваться надо. А индекс сработает при первом позиционировании.
20 Mikeware
 
09.11.11
12:59
(18) Ну и иди по индексу, да собирай номенклатуру, пока индексное поле не изменяется...
21 Dump
 
09.11.11
13:07
(19) "1986? " - не понял
22 DeMi4
 
09.11.11
14:58
Как сравнить значения первой и второй строки
Тоесть Если например МОЛ 1 строки <> МоЛ 2 строки то то то
23 Ёпрст
 
09.11.11
15:00
(22) использовать условный оператор Если и операторы не равно (<>)
24 DeMi4
 
09.11.11
15:04
Для НС=1 По ТЗ.КоличествоСтрок()Цикл
   ТЗ.ПолучитьСтрокуПоНомеру(НС);
   Вот как на языке будет правильно
   Если ТЗ.МОЛ<>ТЗ.МОЛИзследующейстроки Тогд
   конецЕсли
КонецЦикла
25 Ёпрст
 
09.11.11
15:05
(24) ПолучитьЗначение(номерстроки,номерколонки)
или ид колонки, сматри параметры метода в СП
26 DeMi4
 
09.11.11
15:12
Спасибо я че то пока теряюсь в этом СП

Для НС=1 По ТЗ.КоличествоСтрок()Цикл
   ТЗ.ПолучитьСтрокуПоНомеру(НС);
   Если ТЗ.ПолучитьЗначение(НС,2)<>ТЗ.ПолучитьЗначение(НС+1,2) Тогда
       Сообщить(ТЗ.МОЛ);
   КонецЕсли;
   

КонецЦикла

КонецПроцедуры

Вот но что делать с последней строкой

Если ТЗ.ПолучитьЗначение(НС,2)<>ТЗ.ПолучитьЗначение(НС+1,2) Тогда
{D:\WORK1C\5677.ERT(32)}: Номер за пределами значения!
27 filh
 
09.11.11
15:12
(24) а запоминать предыдущие значение и сравнивать, не?
28 Ёпрст
 
09.11.11
15:14
(26) поставиь условие на граничные условия вестимо, либо через если, либо через Макс
29 filh
 
09.11.11
15:14
можно так:
Для НС=1 По ТЗ.КоличествоСтрок()-1 Цикл
   ТЗ.ПолучитьСтрокуПоНомеру(НС);
   Если ТЗ.ПолучитьЗначение(НС,2)<>ТЗ.ПолучитьЗначение(НС+1,2) Тогда
       Сообщить(ТЗ.МОЛ);
   КонецЕсли;
   

КонецЦикла

можно и так:
Для НС=2 По ТЗ.КоличествоСтрок() Цикл
   ТЗ.ПолучитьСтрокуПоНомеру(НС);
   Если ТЗ.ПолучитьЗначение(НС-1,2)<>ТЗ.ПолучитьЗначение(НС,2) Тогда
       Сообщить(ТЗ.МОЛ);
   КонецЕсли;
   

КонецЦикла
30 filh
 
09.11.11
15:15
(28) да у него банально:
По ТЗ.КоличествоСтрок() и ТЗ.ПолучитьЗначение(НС+1,2)
31 miki
 
09.11.11
15:19
(24)тебе же уже сказали:
отсортируй по МОЛ'у (или как ты хотел индекс у хэ-базы), получи значение из первой строки (записи), типа эталон и сравнивай со следущими. Как поменялось - меняй эталон и т.д. пока не кончаться данные.
32 FN
 
09.11.11
15:20
(0) это продолжение Свертка базы ТИС ?
зачем тебе этот дбф вообще?

В старой базе делаешь ТЗ (тока ссылки туда не пихай) и ЗначениеВфайл
В новой базе ЗначениеИзФайла, Сортировать ("МОЛ") + обход ТЗ и запись...

делов на 30 минут
33 Ёпрст
 
09.11.11
15:20
(31) ты что?! Это же еще про целый метод читать в СП придётся!
Как отсортировать ТЗ..
34 DeMi4
 
09.11.11
16:00
помогите еще пожалуйста как сделать чтобы все выполнялось логически

Суть в чем как только мы узнаем что в следующей строке у нас изменится МОЛ то мы записываем документ.
35 DeMi4
 
09.11.11
16:00
Для НС=1 По ТЗ.КоличествоСтрок()Цикл
   ДокВвОст.Новый();
   ТЗ.ПолучитьСтрокуПоНомеру(НС);
   ДокВвОст.Номенклатура=СпрНом.НайтиПоНаименованию(ТЗ.Номенклатура);
   ДокВвОст.Количество=Тз.Количество;
   Если ТЗ.ПолучитьЗначение(НС,2)<>ТЗ.ПолучитьЗначение(НС+1,2) Тогда
       ДокВвОст.Записать();
   КонецЕсли;
   

КонецЦикла;

Как раскидать
36 miki
 
09.11.11
16:03
Ну добавь, если условие выполнится, после
ДокВвОст.Записать();
ДокВвОст.Новый();

Еще проверить после выхода из цикла, если надо - записать.

А вообще условие Если ТЗ.ПолучитьЗначение(НС,2)<>ТЗ.ПолучитьЗначение(НС+1,2)
должно всегда выдавать ошибку на последней строке, что-то_там_не_входит_в_границы.
37 miki
 
09.11.11
16:05
+ для неотсортированной таблицы можешь получить несколько доков для одного МОЛ'а...
В общем - не зачет.
38 DeMi4
 
09.11.11
16:11
ТЗ отсартирована Что сделать чтобы ошибку ту не выдавало
39 FN
 
09.11.11
16:17
(38)
Пример алгоритма
Дано ТЗ: Клиент,Товар,К-во


ТекущийКлиент="";
ТЗ.Сортировать("Клиент");
ТЗ.ВыбратьСтроки();
Док=СоздатьОбъект("Документ");
Пока ТЗ.ПолучитьСтроку()=1 Цикл
   Если ТЗ.Клиент<>ТекущийКлиент тогда
       Если Док.КоличествоСтрок()>0 тогда Док.записать(); КонецЕсли;
       Док.Новый();
       Док.ДатаДок=Рабочаядата();
       ....
       ТекущийКлиент=ТЗ.Клиент;
   КонецЕсли;
   Док.НоваяСтрока()
   Док.Товар=ТЗ.Товар;
   Док.Кво=ТЗ.Кво;
КонецЦикла;
Если Док.КоличествоСтрок()>0 тогда Док.записать(); КонецЕсли;
40 DeMi4
 
09.11.11
22:04
Почему при записи Дока из обработки в журнале не отображается его цена пока не зайдешь в сам документ и не нажмешь кнопку записать
41 Ёпрст
 
09.11.11
22:06
(40) не выбран ТипЦен в шапке дока или, не заполнен еще какой реквизит.
42 DeMi4
 
09.11.11
22:17
Нету такого реквизита в ТИС
43 Ёпрст
 
09.11.11
22:19
(42) да ну ? всю жизь был в реквизите шапки, в 8 редакции мот и не был - там категории цен были, а вот в 9 редакции всегда был.