Имя: Пароль:
1C
1С v8
Читаю 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
22 Serginio1
 
01.12.16
00:01
(20) Ну пусть берет отсюда
1С,Linux,Excel,Word,OpenXML,Net Core
мне не жалка. Ъ наше всЁ
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. у меня практически по до всё трансляторы написаны, так как я люблю, чтобы в коде комментарии начинались с точки с запятой, а не в одном современном языке этого нет.