|
Читаю CSV через ADODB. Recordset.MoveNext() не перемещает курсор дальше | ☑ | ||
---|---|---|---|---|
0
i_rodionov
30.11.16
✎
22:54
|
В чем может быть загвоздка?
Получаю ровно столько строк, сколько в файле, но все одинаковые, как первая строчка. |
|||
1
i_rodionov
30.11.16
✎
22:55
|
ФайлПрайса = Новый Файл(ЛокальныйПутьКФайлу);
СтрокаСоединения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ФайлПрайса.Путь+";Extended Properties='Text;HDR=No;FMT=Delimited';"; ФорматДелимитер = Новый ТекстовыйДокумент(); ФорматДелимитер.ДобавитьСтроку("["+ФайлПрайса.Имя+"]"); ФорматДелимитер.ДобавитьСтроку("Format=Delimited(;)"); ФорматДелимитер.Записать(ФайлПрайса.Путь+"schema.ini",КодировкаТекста.ANSI); Connection = Новый COMОбъект("ADODB.Connection"); Connection.ConnectionString = СтрокаСоединения; Попытка Connection.Open(); Исключение Возврат; КонецПопытки; Command = Новый COMОбъект("ADODB.Command"); RecordSet = Новый COMОбъект("ADODB.RecordSet"); Command.ActiveConnection = Connection; Command.CommandText = "SELECT * FROM ["+ФайлПрайса.Имя+"]"; Command.CommandType = 1;//определение типа команды Попытка RecordSet = Command.Execute(); Исключение //Сообщить(ОписаниеОшибки()); КонецПопытки; НомерСтроки = 0; Пока RecordSet.EOF() = 0 Цикл ПоляСтроки = Recordset.Fields; Если ПараметрыИмпорта.ОкруглятьВМеньшуюСторону Тогда ЦенаРозничная = Ценообразование.ОкруглитьЦену(Цел(Число(ПоляСтроки.Item(Число(ПараметрыИмпорта.ТегРозничнаяЦена)).Name)),ПараметрыИмпорта.ПорядокОкругления,Ложь); Иначе ЦенаРозничная = Ценообразование.ОкруглитьЦену(Число(ПоляСтроки.Item(Число(ПараметрыИмпорта.ТегРозничнаяЦена)).Name),ПараметрыИмпорта.ПорядокОкругления,Ложь); КонецЕсли; Если ПараметрыИмпорта.НеЗагружатьРозничныеЦеныМеньше > ЦенаРозничная Тогда Продолжить; КонецЕсли; СтрокаПрайсов = ТаблицаПрайсов.Добавить(); СтрокаПрайсов.Штрихкод = ПараметрыИмпорта.ДобавлятьПрефиксШтрихкода+СокрЛП(ПоляСтроки.Item(Число(ПараметрыИмпорта.ТегШтрихкод)).Name); СтрокаПрайсов.Наименование = ПоляСтроки.Item(Число(ПараметрыИмпорта.ТегНаименование)).Name; СтрокаПрайсов.ЦенаЗакупочная = Число(ПоляСтроки.Item(Число(ПараметрыИмпорта.ТегРозничнаяЦена)).Name) * ПараметрыИмпорта.КоэффициентЗакупочнойЦены; СтрокаПрайсов.ЦенаРозничная = ЦенаРозничная; Если Число(ПоляСтроки.Item(Число(ПараметрыИмпорта.ТегКоличество)).Name) > 0 Тогда СтрокаПрайсов.Количество = ПараметрыИмпорта.КоличествоПоУмолчанию; Иначе СтрокаПрайсов.Количество = 0; КонецЕсли; Recordset.MoveNext(); КонецЦикла; Recordset.Close(); Connection.Close(); Recordset = Неопределено; Connection = Неопределено; УдалитьФайлы(ФайлПрайса.Путь+"schema.ini"); |
|||
2
Garykom
гуру
30.11.16
✎
23:10
|
Догадайся что делает "Продолжить;" ?
|
|||
3
i_rodionov
30.11.16
✎
23:14
|
(2) Оно там раньше СтрокаПрайсов = ТаблицаПрайсов.Добавить();
а в таблице прайсов ровно столько строк, сколько в прайсе, но все одинаковые |
|||
4
i_rodionov
30.11.16
✎
23:14
|
(2) хотя да, я там забыл Recordset.MoveNext();
|
|||
5
Garykom
гуру
30.11.16
✎
23:16
|
(3) А ты csv то открой и глазками посмотри...
|
|||
6
i_rodionov
30.11.16
✎
23:17
|
(5) Ну, блин там 23 килострок все разные
С Продолжить все ок. Не оно это |
|||
7
Garykom
гуру
30.11.16
✎
23:18
|
(4) Лучше в условие Если взять код вместо Продолжить()
|
|||
8
i_rodionov
30.11.16
✎
23:19
|
(7) Продолжить никогда не исполняется
В данном случае |
|||
9
Garykom
гуру
30.11.16
✎
23:21
|
Тупой вопрос а "RecordSet" = "Recordset" ?
|
|||
10
i_rodionov
30.11.16
✎
23:23
|
(9) Вопрос тупой, иначе был бы рантайм эррор
|
|||
11
Garykom
гуру
30.11.16
✎
23:27
|
(10) вдруг у тя там две их, этих переменных ))
|
|||
12
i_rodionov
30.11.16
✎
23:30
|
(11) Пока RecordSet.EOF() = 0 Цикл
Завершается вовремя, не зацикливается, но данные выбирает всегда из первой строки |
|||
13
Garykom
гуру
30.11.16
✎
23:31
|
(12) Точно из 1-й а не из последней? Если так что выкидывай рекордсет, после теста на другой машине
|
|||
14
Mauser
30.11.16
✎
23:31
|
Потому что вместо .Name надо писать .Value
Ваш КО. |
|||
15
i_rodionov
30.11.16
✎
23:32
|
(14) Пробовал. .Value тоже всегда одинаковые
|
|||
16
i_rodionov
30.11.16
✎
23:35
|
(14) сейчас допишу в .ini файл спецификацию типов и попробрую только через Value
|
|||
17
Mauser
30.11.16
✎
23:36
|
Похоже, одна из черепашек... разрабатывает методом тыка.
|
|||
18
Serginio1
30.11.16
✎
23:37
|
Зачем сглатываешь
Попытка RecordSet = Command.Execute(); Исключение //Сообщить(ОписаниеОшибки()); КонецПопытки; Ну и предпочтительнее использовать булево Пока не RecordSet.EOF() Цикл |
|||
19
Garykom
гуру
30.11.16
✎
23:45
|
Судя по молчанию оно!
|
|||
20
Mauser
30.11.16
✎
23:45
|
(18) Добей его Ъ дотнетом! Новый Врап и все такое, чтобы уж наверняка!
|
|||
21
Serginio1
30.11.16
✎
23:59
|
Если что 1C http://catalog.mista.ru/public/371887/
|
|||
22
Serginio1
01.12.16
✎
00:01
|
||||
23
i_rodionov
01.12.16
✎
00:02
|
вот это работает, когда написал спецификаторы типов и через .Value
ФайлПрайса = Новый Файл(ЛокальныйПутьКФайлу); СтрокаСоединения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ФайлПрайса.Путь+";Extended Properties='Text;HDR=No;FMT=Delimited';"; ФорматДелимитер = Новый ТекстовыйДокумент(); ФорматДелимитер.ДобавитьСтроку("["+ФайлПрайса.Имя+"]"); ФорматДелимитер.ДобавитьСтроку("Format=Delimited(;)"); ФорматДелимитер.ДобавитьСтроку("ColNameHeader=False"); ФорматДелимитер.ДобавитьСтроку("Col"+Строка(Число(ПараметрыИмпорта.ТегШтрихкод)+1)+"=Barcode Text"); ФорматДелимитер.ДобавитьСтроку("Col"+Строка(Число(ПараметрыИмпорта.ТегНаименование)+1)+"=Name Text"); ФорматДелимитер.ДобавитьСтроку("Col"+Строка(Число(ПараметрыИмпорта.ТегРозничнаяЦена)+1)+"=Price Currency"); ФорматДелимитер.ДобавитьСтроку("Col"+Строка(Число(ПараметрыИмпорта.ТегКоличество)+1)+"=Qty Text"); ФорматДелимитер.Записать(ФайлПрайса.Путь+"schema.ini",КодировкаТекста.ANSI); Connection = Новый COMОбъект("ADODB.Connection"); Connection.ConnectionString = СтрокаСоединения; Попытка Connection.Open(); Исключение Возврат; КонецПопытки; Command = Новый COMОбъект("ADODB.Command"); RecordSet = Новый COMОбъект("ADODB.RecordSet"); Command.ActiveConnection = Connection; Command.CommandText = "SELECT * FROM ["+ФайлПрайса.Имя+"]"; Command.CommandType = 1;//определение типа команды Попытка RecordSet = Command.Execute(); Исключение //Сообщить(ОписаниеОшибки()); КонецПопытки; НомерСтроки = 0; Пока Не RecordSet.EOF() Цикл ПоляСтроки = RecordSet.Fields; Если ПараметрыИмпорта.ОкруглятьВМеньшуюСторону Тогда ЦенаРозничная = Ценообразование.ОкруглитьЦену(Цел(Число(ПоляСтроки.Item("Price").Value)),ПараметрыИмпорта.ПорядокОкругления,Ложь); Иначе ЦенаРозничная = Ценообразование.ОкруглитьЦену(Число(ПоляСтроки.Item("Price").Value),ПараметрыИмпорта.ПорядокОкругления,Ложь); КонецЕсли; Если ПараметрыИмпорта.НеЗагружатьРозничныеЦеныМеньше > ЦенаРозничная Тогда Recordset.MoveNext(); Продолжить; КонецЕсли; СтрокаПрайсов = ТаблицаПрайсов.Добавить(); СтрокаПрайсов.Штрихкод = ПараметрыИмпорта.ДобавлятьПрефиксШтрихкода+СокрЛП(ПоляСтроки.Item("Barcode").Value); СтрокаПрайсов.Наименование = ПоляСтроки.Item("Name").Value; СтрокаПрайсов.ЦенаЗакупочная = Число(ПоляСтроки.Item("Price").Value) * ПараметрыИмпорта.КоэффициентЗакупочнойЦены; СтрокаПрайсов.ЦенаРозничная = ЦенаРозничная; Если Число(ПоляСтроки.Item("Qty").Value) > 0 Тогда СтрокаПрайсов.Количество = ПараметрыИмпорта.КоличествоПоУмолчанию; Иначе СтрокаПрайсов.Количество = 0; КонецЕсли; RecordSet.MoveNext(); КонецЦикла; Recordset.Close(); Connection.Close(); Recordset = Неопределено; Connection = Неопределено; УдалитьФайлы(ФайлПрайса.Путь+"schema.ini"); |
|||
24
Mauser
01.12.16
✎
00:24
|
А зачем тебе
RecordSet = Новый COMОбъект("ADODB.RecordSet"); ? |
|||
25
Mauser
01.12.16
✎
00:27
|
Да и возню с Command можно выбросить.
Рекордсет очень хорошо получается как результат вызова экзекьюта у коннекшна. |
|||
26
Torquader
01.12.16
✎
00:29
|
(24)Видимо, он переписывал с VbScript, а там переменные определяются перед записью в них.
Вообще, автору за русские и латинские переменные - отдельное Фу. И вообще, выбрать всё, а потом по индексу поля скушать - это дикое решение - по нормальному в SQL-запросе выбрать то, что нужно. Или он и в 1с тоже сначала всё из регистра выбирает, а потом из результата берёт то, что нужно. |
|||
27
Mauser
01.12.16
✎
00:39
|
(26) В вбскрипт переменные определяются сразу по месту использования. Объектные значения - через сет.
Или ты из этих, которые Яву и яваскрипт путают? =) |
|||
28
Torquader
01.12.16
✎
00:49
|
(27) Я из тех, кто свой транслятор для VbScript написал, чтобы с типизацией и явным указанием переменных.
|
|||
29
Mauser
01.12.16
✎
00:54
|
(28) Отлично! На каком этапе находится согласование проекта памятника в полный рост?
|
|||
30
Torquader
01.12.16
✎
00:56
|
(29) Не понял ваш юмор.
P.S. у меня практически по до всё трансляторы написаны, так как я люблю, чтобы в коде комментарии начинались с точки с запятой, а не в одном современном языке этого нет. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |