AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.04.2013, 11:43   #1  
ilyuha is offline
ilyuha
Участник
 
32 / 15 (1) ++
Регистрация: 28.01.2011
Ошибка при экспорте DBF
Добрый день.
АХ2009
Win XP
У нас имеется самописный функционал, который выгружает документы в формате DBF. Но у некоторых пользователей возникает ошибка при экспорте:
"Метод "execute" в COM-объекте класса "ADODB.Command" возвратил код ошибки 0x80040E14 (<неизвестно>), который означает: [Microsoft][Драйвер ODBC dBase] Ошибка синтаксиса в инструкции CREATE TABLE."


Драйвер установлен.
Посоветуйте пожалуйста, в чем может быть причина...
Старый 04.04.2013, 12:42   #2  
asd1274 is offline
asd1274
Участник
Компания АМАНД
 
32 / 12 (1) ++
Регистрация: 29.09.2008
Адрес: Ковров
У вас проблема с синтаксисом в команде создания файла dbf.
Попробуйте ее вытащить в info и выполнить например в Foxpro.
Вот рабочий вариант:

X++:
    CCADOConnection              dBF_Con;
    CCADOCommand             aDO;
    CCADORecordset             aDR;
    str filePath = 'c:\\1\\', fileName = '001.dbf';
    str                                   cmdText, cmd_del, cmd_value;
    CustTable                        CustTable;
    RContractTable                RContractTable;

    ;

    dBF_Con     = new CCADOConnection();
    aDO         = new CCADOCommand();
    aDR         = new CCADORecordset();


     dBF_Con.open("Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Extended Properties=dbase 5.0;Data Source="+filePath+";");
         ADO.activeConnection(dBF_Con);
        if (dBF_Con)
    {
         cmd_del = "DROP Table "+ fileName;
         ADO.commandText(cmd_del);
         ADR = ADO.execute();
       cmdText = " CREATE TABLE " + fileName + " (ACCOUNTNUM char(20), DATEDOG date, NDOG char(20), DOGACCOUNT char(10))"; // договора

        ADO.commandText(cmdText);
        ADR = ADO.execute();
      }

Как то так - сверьте с тем что есть у вас.

Последний раз редактировалось asd1274; 04.04.2013 в 12:47.
Старый 04.04.2013, 13:03   #3  
ilyuha is offline
ilyuha
Участник
 
32 / 15 (1) ++
Регистрация: 28.01.2011
Цитата:
Сообщение от asd1274 Посмотреть сообщение
У вас проблема с синтаксисом в команде создания файла dbf.
Попробуйте ее вытащить в info и выполнить например в Foxpro.
Вот рабочий вариант:

X++:
    CCADOConnection              dBF_Con;
    CCADOCommand             aDO;
    CCADORecordset             aDR;
    str filePath = 'c:\\1\\', fileName = '001.dbf';
    str                                   cmdText, cmd_del, cmd_value;
    CustTable                        CustTable;
    RContractTable                RContractTable;

    ;

    dBF_Con     = new CCADOConnection();
    aDO         = new CCADOCommand();
    aDR         = new CCADORecordset();


     dBF_Con.open("Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Extended Properties=dbase 5.0;Data Source="+filePath+";");
         ADO.activeConnection(dBF_Con);
        if (dBF_Con)
    {
         cmd_del = "DROP Table "+ fileName;
         ADO.commandText(cmd_del);
         ADR = ADO.execute();
       cmdText = " CREATE TABLE " + fileName + " (ACCOUNTNUM char(20), DATEDOG date, NDOG char(20), DOGACCOUNT char(10))"; // договора

        ADO.commandText(cmdText);
        ADR = ADO.execute();
      }

Как то так - сверьте с тем что есть у вас.
У нас все практически один в один, только имеются доп. условия...
Старый 04.04.2013, 13:04   #4  
asd1274 is offline
asd1274
Участник
Компания АМАНД
 
32 / 12 (1) ++
Регистрация: 29.09.2008
Адрес: Ковров
Какие именно - если можете дайте ваш код - попробую у себя запустить.
Старый 04.04.2013, 13:49   #5  
ilyuha is offline
ilyuha
Участник
 
32 / 15 (1) ++
Регистрация: 28.01.2011
X++:
cmdText                 = " CREATE TABLE " + filenameTmp + " (";
            cmdTextInsertTemplate   = " INSERT INTO "  + filenameTmp + " (";

            while select usrExpImpField
            order by usrExpImpField.Sequence
            where usrExpImpField.GroupId == groupId
            {
                if (usrExpImpField.Enabled)
                {
                    fieldName = usrExpImpField.ExFieldName ? usrExpImpField.ExFieldName : usrExpImpField.fieldName(false, "");
                   cmdText += strfmt("%1 %2%3,",
                                    fieldName,
                                    this.BaseTypeToADOType(usrExpImpField.baseType()),
                                    usrExpImpField.baseType() == Types::String ? strfmt("(%1)",usrExpImpField.FieldSize()) : "");

                    cmdTextInsertTemplate += fieldName + ",";
                }
            }

            cmdText =   strdel(cmdText,strlen(cmdText),1);
            cmdText += ")";

            cmdTextInsertTemplate =   strdel(cmdTextInsertTemplate,strlen(cmdTextInsertTemplate),1);
            cmdTextInsertTemplate += ") values (";

            dBF_Con     = new CCADOConnection();
            aDO         = new CCADOCommand();
            aDR         = new CCADORecordset();
            dBF_Con.open("Driver={Microsoft dBase Driver (*.dbf)};");
            ADO.activeConnection(dBF_Con);

            if (dBF_Con)
            {
                ADO.commandText(cmdText);
                ADR = ADO.execute();
            }
Старый 04.04.2013, 15:46   #6  
asd1274 is offline
asd1274
Участник
Компания АМАНД
 
32 / 12 (1) ++
Регистрация: 29.09.2008
Адрес: Ковров
Если можно, то покажите здесь значение cmdText - перед "ADR = ADO.execute();" - я его прогоню в foxpro.
Старый 04.04.2013, 16:37   #7  
ilyuha is offline
ilyuha
Участник
 
32 / 15 (1) ++
Регистрация: 28.01.2011
Цитата:
Сообщение от asd1274 Посмотреть сообщение
Если можно, то покажите здесь значение cmdText - перед "ADR = ADO.execute();" - я его прогоню в foxpro.
CREATE TABLE \\Fs1\Reports\Axapta\АПТЕЧКА\003355.dbf (NDOC char(20),DATEDOC date,CODEPST char(20),EAN13 char(80),PRICE1 char(20),PRICE2 numeric,PRICE2N numeric,QNT numeric,SER char(20),GDATE char(20),DATEMADE char(20),NAME char(140),CNTR char(60),FIRM char(140),QNTPACK numeric,NDS numeric,REGPRC char(20),NUMGTD char(30),SERTIF char(35),SERTDATE date,SERTORG char(20),SUMPAY numeric,SUMNDS10 char(20),SUMNDS20 char(20),SUM10 char(20),SUM20 char(20),SUM0 char(20),PODRCD char(140),NUMZ char(20),DATEZ date,BILLNUM char(30),BILLDT date,SERTGIVE date,DATEPAY char(20))

Повторюсь, эта ошибка только на нескольких компьютерах
Старый 04.04.2013, 19:30   #8  
asd1274 is offline
asd1274
Участник
Компания АМАНД
 
32 / 12 (1) ++
Регистрация: 29.09.2008
Адрес: Ковров
Все ясно - вы пытаетесь в операторе CREATE сразу указать путь к файлу - так делать нельзя. Как указывать путь к файлу в примере есть. Завтра утром выложу полностью пример как желательно делать - переделайте под себя и должно работать. Кроме того наверное имеет смысл разбить операторы CREATE и INSERT.

Последний раз редактировалось asd1274; 04.04.2013 в 20:03.
Старый 04.04.2013, 20:10   #9  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Для работы с DBF осмелюсь посоветовать начать использовать Net сборки, например FastDBF: Обработка DBF через .net
Удобней использовать, выше скорость и на сервере x64 работает.
Дополнительный плюс, в отличие от мелкософтовского драйвера, позволяет корректно задавать количество десятичных разрядов для типа numeric и различные кодировки русского.
За это сообщение автора поблагодарили: asd1274 (1), ilyuha (1).
Старый 04.04.2013, 21:44   #10  
asd1274 is offline
asd1274
Участник
Компания АМАНД
 
32 / 12 (1) ++
Регистрация: 29.09.2008
Адрес: Ковров
Цитата:
Сообщение от handy-comp Посмотреть сообщение
Для работы с DBF осмелюсь посоветовать начать использовать Net сборки, например FastDBF: Обработка DBF через .net
Удобней использовать, выше скорость и на сервере x64 работает.
Дополнительный плюс, в отличие от мелкософтовского драйвера, позволяет корректно задавать количество десятичных разрядов для типа numeric и различные кодировки русского.
Весьма интересный вариант - надо будет попробовать. Спасибо
Старый 05.04.2013, 08:15   #11  
asd1274 is offline
asd1274
Участник
Компания АМАНД
 
32 / 12 (1) ++
Регистрация: 29.09.2008
Адрес: Ковров
Вот рабочий пример - посмотрите его - наверное имеет смысл так сделать. Правда не сделал проверку на наличие файла.

X++:
static void CReateDBFCustomer_RContract(Args _args)
{


    CCADOConnection             dBF_Con;
    CCADOCommand                aDO;
    CCADORecordset              aDR;
    str filePath = 'c:\\1\\', fileName = '001.dbf';
    str                         cmdText, cmd_del, cmd_value;
    CustTable                   CustTable;
    RContractTable              RContractTable;

    ;

    dBF_Con     = new CCADOConnection();
    aDO         = new CCADOCommand();
    aDR         = new CCADORecordset();


     dBF_Con.open("Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Extended Properties=dbase 5.0;Data Source="+filePath+";");
     
        ADO.activeConnection(dBF_Con);
        if (dBF_Con)
    {
         cmd_del = "DROP Table "+ fileName;
         ADO.commandText(cmd_del);
         ADR = ADO.execute();

       cmdText = " CREATE TABLE " + fileName + " (ACCOUNTNUM char(20), DATEDOG date, NDOG char(20), DOGACCOUNT char(10))"; 

        ADO.commandText(cmdText);
        ADR = ADO.execute();

      while select RContractTable


        {

        cmd_value = strfmt("%1', '%2', '%3', '%4')", RContractTable.RContractPartnerCode, date2str(RContractTable.ContractDate, 123, 2, -1, 2, -1, 2),
                        RContractTable.RContractNumber, RContractTable.RContractAccount);



        cmdText = "insert into " + fileName + " (ACCOUNTNUM, DATEDOG, NDOG, DOGACCOUNT) values ('" + cmd_value ; 


        ADO.commandText(cmdText);
        ADR = ADO.execute();

        }

     }
}
Старый 05.04.2013, 08:58   #12  
asd1274 is offline
asd1274
Участник
Компания АМАНД
 
32 / 12 (1) ++
Регистрация: 29.09.2008
Адрес: Ковров
Еще уточнил - на самом деле можно в оператор CREATE указывать директорию, но нужен движок Jet, то есть где то так:
X++:
 dBF_Con.open("Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Extended Properties=dbase 5.0;Data Source="+filePath+";");
Однако лучше и наверное проще делать как в предыдущем посте.
Старый 05.04.2013, 10:54   #13  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
А с правами доступа к нужной директории все в порядке?

1. С того рабочего места, где Вы выполняете код видна та сетевая директория, в которой Вы пытаетесь создать файл DBF?
1.2. Вы выполняете код со стороны сервера или клиента? Сетевая папка видна и со стороны сервера и со стороны клиента?
2. У пользователя, от имени которого идет обращение, есть права на создание файлов в указанной директории?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 05.04.2013, 12:31   #14  
asd1274 is offline
asd1274
Участник
Компания АМАНД
 
32 / 12 (1) ++
Регистрация: 29.09.2008
Адрес: Ковров
Наверное в данном случае была бы не синтаксическая ошибка а какая то другая или я ошибаюсь?
Старый 05.04.2013, 13:52   #15  
ilyuha is offline
ilyuha
Участник
 
32 / 15 (1) ++
Регистрация: 28.01.2011
Цитата:
Сообщение от asd1274 Посмотреть сообщение
Все ясно - вы пытаетесь в операторе CREATE сразу указать путь к файлу - так делать нельзя. Как указывать путь к файлу в примере есть. Завтра утром выложу полностью пример как желательно делать - переделайте под себя и должно работать. Кроме того наверное имеет смысл разбить операторы CREATE и INSERT.
Можно и так.
Переделали бы, если у всех была эта ошибка.
Старый 05.04.2013, 13:54   #16  
ilyuha is offline
ilyuha
Участник
 
32 / 15 (1) ++
Регистрация: 28.01.2011
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
А с правами доступа к нужной директории все в порядке?

1. С того рабочего места, где Вы выполняете код видна та сетевая директория, в которой Вы пытаетесь создать файл DBF?
1.2. Вы выполняете код со стороны сервера или клиента? Сетевая папка видна и со стороны сервера и со стороны клиента?
2. У пользователя, от имени которого идет обращение, есть права на создание файлов в указанной директории?
С правами все в порядке.
Старый 05.04.2013, 14:04   #17  
asd1274 is offline
asd1274
Участник
Компания АМАНД
 
32 / 12 (1) ++
Регистрация: 29.09.2008
Адрес: Ковров
Повторюсь - тогда проблема в провайдере - вам надо Jet указывать обязательно. Хотя наверное проще было бы CREATE сделать без указания пути к файлу - его надо перенести в описание провайдера.
За это сообщение автора поблагодарили: ilyuha (1).
Теги
ado, dbf, создание файла

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Need help ошибка Неправильный тип индекса массива. Evgeniy2020 DAX: Администрирование 3 05.11.2013 03:13
Ошибка в логе при установке клиента AX 2009 sao DAX: Администрирование 9 04.02.2010 11:56
ошибка при экспорте в WORD Nikolaich DAX: Программирование 14 27.01.2009 17:50
Поля 255 символов при экспорте в DBF Beast-L DAX: Программирование 5 25.07.2007 14:22
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 13:47.