|
Данные из ДБФ | ☑ | ||
---|---|---|---|---|
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
|
Можно сделать индекс по интересующим полям, будет легко и просто искать
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |