Имя: Пароль:
1C
1С v8
Данные из ДБФ
,
0 Tanis
 
15.03.13
12:45
Добрый день!
Проблема с циклом, не доходит до конца, и на одной позиции выдает ошибку "Значение не является значением объектного типа (ДляБольничных)
"

ДБФ = Новый XBase;
   ДБФ.Кодировка = КодировкаXBase.ANSI;
   ДБФ.ОткрытьФайл(КаталогДанных+"zp_2011.dbf");    
   
   ДБФ.Первая();
   Пока НЕ ДБФ.ВКонце() Цикл
       
       ДатаДень=Лев(ДБФ.N6, 2);
       ДатаМес=Сред(ДБФ.N6, 4, 2);
       ДатаГод= "20" + Прав(ДБФ.N6, 2);
       
       Дата = ДатаГод + ДатаМес + ДатаДень;    
       
       
       Если Число(ДатаГод) < 2012 Тогда
           ДБФ.Следующая();
           Продолжить;
       КонецЕсли;

       Если СокрЛП(ДБФ.N2) <> ИДСотрудника Тогда    
           ДБФ.Следующая();
           Продолжить;
       КонецЕсли;
               
       ИскомаяДата = НачалоДня(КонецМесяца(Дата));
       
       Если СокрЛП(ДБФ.N7) <> "Повременно" Тогда    
           
           СтрокаТаблицы = тзЗаработок.Найти  (ИскомаяДата, "ДатаПериода");            СтрокаТаблицы.ДляБольничных = (ДБФ.N9);                  
Сообщить(""+ИскомаяДата+" "+ДБФ.N7+", "+ДБФ.N8+", "+ДБФ.N9);
                               
           ДБФ.Следующая();
           Продолжить;
       КонецЕсли;
       
                   
       СтрокаТаблицы = тзЗаработок.Найти(ИскомаяДата, "ДатаПериода");
       
       Если СтрокаТаблицы <> Неопределено Тогда
                       СтрокаТаблицы.Начислено = СтрокаТаблицы.Начислено + ДБФ.N10;
           
       КонецЕсли;
       
       ДБФ.Следующая();
                           
   КонецЦикла;
   ОткрытьЗначение(тзЗаработок);

   Возврат тзЗаработок;
1 butterbean
 
15.03.13
12:47
видать не нашел строку
2 Tanis
 
15.03.13
12:47
Ошибку выдает вот на этой строке:

СтрокаТаблицы.ДляБольничных = (ДБФ.N9);

А не доходит вот до этого:

СтрокаТаблицы = тзЗаработок.Найти(ИскомаяДата, "ДатаПериода");
       
       Если СтрокаТаблицы <> Неопределено Тогда
                       СтрокаТаблицы.Начислено = СтрокаТаблицы.Начислено + ДБФ.N10;
           
       КонецЕсли;
       
       ДБФ.Следующая();
3 Chikko
 
15.03.13
12:47
Синтаксис:

Найти(<Значение>, <Колонки>)
Возвращаемое значение:

Тип: СтрокаТаблицыЗначений, Неопределено.
Строка, в которой содержится искомое значение. Если значение не найдено, то возвращается значение Неопределено.

так вроде.
4 Tanis
 
15.03.13
12:47
Находит, он не сразу на ней стопорится. Несколько вариантов прогоняет...
5 butterbean
 
15.03.13
12:48
(4) смешно
6 Tanis
 
15.03.13
12:48
Пробовал.
Получается он на пустом прерывается?
7 Chikko
 
15.03.13
12:50
попробуй так:
СтрокаТаблицы = тзЗаработок.Найти  (ИскомаяДата,"ДатаПериода");
Если НЕ СтрокаТаблицы = Неопределено Тогда
СтрокаТаблицы.ДляБольничных = (ДБФ.N9);
Сообщить(""+ИскомаяДата+" "+ДБФ.N7+", "+ДБФ.N8+", "+ДБФ.N9);
КонецЕсли;
8 Tanis
 
15.03.13
12:59
Теперь ошибки по типу нет.
Но дальше все равно идти не хочет...

И данная строчка почему-то не всеми цифрами заполняется.
9 Chikko
 
15.03.13
13:01
(8) Там где не заполняется-в тзЗаработок нету подходящих строк. Ставь остановку по ошибке и смотри значения.
10 Tanis
 
15.03.13
13:07
т.е остановку по ошибке? просто Остановку или с условием?
11 Tanis
 
15.03.13
13:07
и дальше то почему цикл не идет?
12 Chikko
 
15.03.13
13:09
А дальше куда? "Продолжить" само написалось?=)
13 Tanis
 
15.03.13
13:15
Хм.Странно...
Давно вроде с этим работало...

Спасибо!
14 Tanis
 
15.03.13
16:08
В таблице получается несколько строк с одинаковой датой, как нужно написать чтоб

СтрокаТаблицы.Начислено

Если она в первой строке с датой пустая, то бралась из следующей?
15 sapphire
 
15.03.13
16:15
(0) Это для каждого сотрудника каждый раз открывается dbf-ка?!
16 Tanis
 
15.03.13
16:25
Т.е? Для каждого?
Точнее надо даже не одно значение, а сумму значений из колонки.

Или если еще и группировку по дате сделать, то вообще идеал.
17 sapphire
 
15.03.13
16:28
(16) Ну из кода:
Если СокрЛП(ДБФ.N2) <> ИДСотрудника Тогда    
           ДБФ.Следующая();
           Продолжить;
       КонецЕсли;

Значит, либо сей кусок в цикле, либо код в (0)...
{Оставляет желать лучшего}
18 sapphire
 
15.03.13
16:30
(16) Легко, используя ADO DB получить желаемое
19 Tanis
 
15.03.13
16:32
Почему она открывается? Он же просто следующую строчку проверяет.

У меня сейчас вопрос в другом... До красоты кода мне еще расти и расти...
20 sapphire
 
15.03.13
16:34
(19) Толку оптимизировать изначально кривой код?
21 Tanis
 
15.03.13
16:38
Чем кривой? Идет перебор строк. ДБФ как открылась, и до последней строки не закрывается.
22 sapphire
 
15.03.13
16:44
(21) Зачем? Если надо отобрать только записи, с  ДБФ=ИДСотрудника и ДБФ.N7<> "Повременно".
23 Tanis
 
15.03.13
16:49
Почему только эти? Там еще куча значений...
24 sapphire
 
15.03.13
17:00
(23) Врешь :))))
Если СокрЛП(ДБФ.N2) <> ИДСотрудника Тогда    
        ДБФ.Следующая(); // ЗАПИСЬ ПРОПУСКАЕТСЯ
        Продолжить;
КонецЕсли;
25 Tanis
 
15.03.13
17:06
Так если N2 совпадает, то там еще куча.
Все равно не понимаю :-(, чем не подходит такой перебор строк
26 sapphire
 
15.03.13
17:08
(25) Тем, что мееееедддддллллееееенннноооо
27 Tanis
 
15.03.13
17:17
А как быстро?
28 sapphire
 
15.03.13
17:21
(27) см (18) там запросом можно получить сразу то, что нужно.
29 Ювелир
 
15.03.13
17:24
Можно еще ДБФ сразу прочитать в ТЗ, а потом уже работать с ней. Ежли конечно она не слишком велика.
30 MKZM
 
15.03.13
18:41
Можно сделать индекс по интересующим полям, будет легко и просто искать
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший