Конференция "Базы" » Проблемы с ТClientDataSet на "чистом" компьютере [Не знаю...]
 
  • ssmaxx (23.01.12 15:20) [0]
    Всем добрый день!.
    Столкнулся с такой проблемой: На форме лежит  ТClientDataSet. В ней формирую таблицу (ручками), сохраняю в файл MyBase xml. В дальнейшем при запуске программы база замечательно обрабатывается (всякие добавления/изменения). Но переношу программу (exe-шник) на другой комп, где не установлен Delphi - и получаю ошибку:

    MailsTable: Field 'State' not found

    MailsTable - это моя таблица (сам ТClientDataSet)
    State - это одно из полей.
    При этом в файле xml это поле точно есть. И загружается xml в MailsTable! Честно говоря, с таблицами до этого вообще не сталкивался. Подскажите, что делать!
  • Медвежонок Пятачок © (23.01.12 16:05) [1]
    При этом в файле xml это поле точно есть.

    Может и есть. Но только не в том файле.
    В том, который грузится его нету.
  • ssmaxx (23.01.12 16:16) [2]
    Function TMainForm.LoadBD;
    begin
     Try
       Memo1.Lines.Add(ExtractFilePath(Application.ExeName)+'MailsTable.xml');
       MailsTable.LoadFromFile(ExtractFilePath(Application.ExeName)+'MailsTable.xml');
       Result:=True;
     Except Result:=False;
     end;

    Файл MailsTable.xml также копирую в папку с программой. Функция проходит и возвращает ИСТИНА
    Ниже код вызова функции:

     Memo1.Lines.Add('Загружаем базу...');
     if LoadBD then begin
       Memo1.Lines.Add('База загружена.');
     end else begin
       Memo1.Lines.Add('База не загружена!!! Выходим.');
       Goto ExitProg;
     end;

    В Memo1 появляется 'База загружена.'. Как я понял, проблемы начинаются, когда в программе происходит обращение к полям таблицы...
  • Медвежонок Пятачок © (23.01.12 16:25) [3]
    Ну загружена.
    Но поля там нет.
  • ssmaxx (23.01.12 16:35) [4]
    Эээ... а как это?
    В файле поле есть (ниже текст файла xml с "чистого" компьютера, его загружаем)
    <?xml version="1.0" standalone="true"?>
    -<DATAPACKET Version="2.0">
     -<METADATA>
       -<FIELDS>
         <FIELD fieldtype="i4" attrname="ID"/>
         <FIELD fieldtype="string" attrname="MailAddress" WIDTH="100"/>
         <FIELD fieldtype="string" attrname="URL" WIDTH="200"/>
         <FIELD fieldtype="dateTime" attrname="StartTime"/>
         <FIELD fieldtype="i4" attrname="SeeTimeInSec"/>
         <FIELD fieldtype="ui1" attrname="State"/>
         <FIELD fieldtype="ui1" attrname="Type"/>
         <FIELD fieldtype="bin.hex" attrname="Msg" WIDTH="500" SUBTYPE="Text"/>
       </FIELDS>
       <PARAMS/>
     </METADATA>
    <ROWDATA/>
    </DATAPACKET>

    Загрузка происходит. Куда девается поле? И что мне надо сделать, чтобы поля в ТClientDataSet загрузились правильно?
  • Медвежонок Пятачок © (23.01.12 16:37) [5]
    В файле поля нет.
    В этом есть, а в том, который грузится там, - нету.
  • Медвежонок Пятачок © (23.01.12 16:38) [6]
    Причем говорит это тебе сам датасет.
    А ему-то лучше знать, есть у него поле или нет у него поля.
  • ssmaxx (23.01.12 17:01) [7]
    На "чистом" компьютере нет Дельфи, но есть файл программы, ЕСТЬ файл с таблицей в той же папке, в которой есть поле State (текст файла показал выше, он взят прям с 'чистого' компьютера). Если файл есть, то и загрузка должна производиться из него?. Загрузка из файла происходит, но поле State не подгружается (я подозреваю, что и все остальные поля также не загружаются). Вот в этом и вопрос: а почему они не загружаются? (на компе с установленной Дельфи все поля загружаются). Может, проблема в нехватке каких-либо библиотек? Или я не совсем понимаю принцип загрузки?
  • Медвежонок Пятачок © (23.01.12 17:12) [8]
    Вот в этом и вопрос: а почему они не загружаются?

    Потому что его там нет .
  • Anatoly Podgoretsky © (23.01.12 17:47) [9]
    > ssmaxx  (23.01.2012 15:20:00)  [0]

    Странное имя для таблицы
  • ssmaxx (23.01.12 19:15) [10]

    > Странное имя для таблицы

    Что-ж тут странного - таблица писем из почтового ящика. Отбираются те, которые мне нужны среди общей массы писем.


    > Потому что его там нет .

    Я именно этого и понять не могу: почему его там нет, если файл с таблицей (и с этим полем) есть. А т.к. я этого не могу понять, я и придумать, что сделать, не могу. Пожалуйста, как для чайника, объясните, что надо добавить на "чистый" комп (или в код программы), чтобы ДатаСет увидел в файле нужные поля и загрузил их.

    P.S. Забыл сказать, еще на "чистый" комп скопировал файл midas.dll. Вроде, без него ДатаСет тоже не работает.
  • Johnmen © (23.01.12 19:43) [11]
    Где код выгрузки-загрузки CDS?
    И CDS прекрасно работает без midas.dll, если скомпилировано с uses MidasLib.
  • ssmaxx (23.01.12 20:03) [12]

    > если скомпилировано с uses MidasLib

    Нет, без него. С ним откомпилировался. Спасибо за совет.

    > Где код выгрузки-загрузки CDS?

    Первый раз поля таблицы заполнил вручную в ДатаСете. Затем сохранил пустую таблицу в файл MailsTable.xml  (текст полученного файла в посте выше).
    Затем очистил ДатаСет (в Дельфи на ДатаСете правой кнопкой -> Clear data).
    Подготовка закончена. Запускаю программу.
    В программе есть функция:

    Function TMainForm.LoadBD;
    begin
    Try
      Memo1.Lines.Add(ExtractFilePath(Application.ExeName)+'MailsTable.xml');
      MailsTable.LoadFromFile(ExtractFilePath(Application.ExeName)+'MailsTable.xml');
      Result:=True;
    Except Result:=False;
    end;

    Код, вызывающий эту функцию (в самом начале программы):

    if LoadBD then begin  
       Memo1.Lines.Add('База загружена.');
    end else begin
       Memo1.Lines.Add('База не загружена!!! Выходим.');
      Goto ExitProg;
    end;
    ...
    // Дальше обращаюсь к ДатаСету:
    ...

           MailsTable.Insert;
           MailsTable.FieldByName('ID').AsInteger:=1;
           MailsTable.FieldByName('MailAddress').AsString:=Address;
           ...
           MailsTable.FieldByName('State').AsInteger:=0;
           if Kaska then MailsTable.FieldByName('Type').AsInteger:=0 else MailsTable.FieldByName('Type').AsInteger:=1;
           MailsTable.FieldByName('Msg').Value:=Memo2.Lines.Text;
           MailsTable.Post;
           SaveBD;
           ...

    Функция сохранения базы:

    Function TMainForm.SaveBD;
    begin
     Try
       MailsTable.SaveToFile(ExtractFilePath(Application.ExeName)+'MailsTable.xml');
       Result:=True;
     Except Result:=False;
     end;
    end;

    И получается такая штука: на компьютере с Дельфи данный код работает, на другом компьютере (без дельфи) - ошибка.
  • sniknik © (23.01.12 20:34) [13]
    <FIELD fieldtype="ui1" attrname="State"/>
    <FIELD fieldtype="ui1" attrname="Type"/>


    "напрягают" меня как то эти типы... понятно ансигнед инт 1 байт типа, но уверен, что оно там есть?

    > на компьютере с Дельфи данный код работает, на другом компьютере (без дельфи) - ошибка.
    чтение или запись? если читать так же с 9, как на "чистом"? какая версия дельфи? и стоял/стоит ли на "чистом" другая версия/программа использующая зарегистрированный мидас?

    > Except Result:=False;
    > end;
    ламеризм детектед... зачем прячешь реальную ошибку?

    ради идиотских сообщений? -  
      'База загружена.' 'База не загружена!!! Выходим.'
    ???
    а типа так не понятно, что она загружена, если работает, или что нет, если ексепт...
  • ssmaxx (23.01.12 21:18) [14]
    <FIELD fieldtype="ui1" attrname="State"/> - тип Byte

    > ламеризм детектед... зачем прячешь реальную ошибку?


    Я и не спорю, что ламер... Обработку ошибок я еще не разбирал. Пока завис на ДатаСете :)
    Сообщения для информации.

    > чтение или запись?

    Даже не могу сказать уверенно, т.к. запускаю exe-шник, он просто выдает вышеуказанную ошибку. Скорее всего при записи (т.к. она первой по коду программы идет).

    > какая версия дельфи?

    Delphi XE

    > и стоял/стоит ли на "чистом" другая версия/программа использующая
    > зарегистрированный мидас?

    Специально ничего не ставил. Где посмотреть, что стоит, а что нет, даже не знаю.

    > а типа так не понятно, что она загружена, если работает,
    >  или что нет, если ексепт...


    Мне она нужна сейчас рабочая хотябы из дома (где есть Дельфи). Если я уберу блок try ... Except - прога будет вылетать...
    Хотел на работе тоже поставить, а оно вона как... не получается.
  • ssmaxx (23.01.12 21:26) [15]
    ОПА... На ноуте жены запустил (Win XP x86) - все заработало...
    Наверное проблема не с ДатаСетом, а с какими-либо ограничениями пользователя. Буду донимать вопросами своего сисадмина!

    Всем откликнувшимся огромное спасибо!!!
  • sniknik © (23.01.12 21:57) [16]
    > а с какими-либо ограничениями пользователя.
    поищи на проблемном компе другую версию мидас.dll.
  • sniknik © (23.01.12 22:04) [17]
    > Я и не спорю, что ламер... Обработку ошибок я еще не разбирал. Пока завис на ДатаСете :)
    > Сообщения для информации.
    блин, люди!!! вы начинаете через жопу ...
    если бы не твоя "обработка"/прятки ошибок, то возможно и проблемы бы не было... ну вот сказало бы сразу (возможно) - "несовместимость версий ... где", разве не проще бы было?
    нет же - "мне бы чтобы работало, прямо сейчас, а разбираться и читать почему не работает буду потом"... истинный ламеризм. срочно в дворники с таким подходом.
  • Плохиш © (24.01.12 02:56) [18]

    > срочно в дворники с таким подходом.

    Чистые улицы надоели?
  • ssmaxx (24.01.12 08:50) [19]
    Критика, критика... Постараюсь учесть Ваши замечания.
    А по делу - помогло:

    > если скомпилировано с uses MidasLib

    Еще раз спасибо!!!
  • Inovet © (24.01.12 10:30) [20]
    > [19] ssmaxx   (24.01.12 08:50)

    Критика тоже по делу. Ты раз взялся обрабатывать исключения, так добавь к "База не открыта" исходное сообщение о причине, ты же его просто теряешь, а ценность твоего нулевая.
 
Конференция "Базы" » Проблемы с ТClientDataSet на "чистом" компьютере [Не знаю...]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]