Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2016, 23:06   #1
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию Record или class

Здравствуйте. Помогите, пожалуйста, разобраться с class или record.
Есть n-количество xml файлов такого содержания(Привожу описание по-русски, чтобы было понятнее)
Код:
Документ
   ШапкаДокумента
     ДатаДок
     НомерДок
     ТипДокумента
     (....еще куча всего)
   ШапкаДокумента_Конец
   ПолучательДокумента
      ИНН
      ОГРН
      (....еще куча всего)
   ПолучательДокумента_конец
   ОтправительДокумента
      ИНН
      ОГРН
      (....еще куча всего)
   ОтправительДокумента_конец
и т.п. ……
Документ_КОНЕЦ
Создаю record
Код:
Type PДокумент = ^ TДокумент;
TДокумент = record
      ID : Integer;
      NUMBER : AnsiString;
      ID_Получателя : Integer;
      ID_Отправителя : Integer;
    end;

Type PПолучатель = ^ TПолучатель;
TПолучатель = record
      ID : Integer;
      ИНН : AnsiString;
      ОГРН : Integer;
    end;

Type PОтправитель = ^ TОтправитель;
TОтправитель = record
      ID : Integer;
      ИНН : AnsiString;
      ОГРН : Integer;
    end;
и т.п. ……
Я привел только 3 record и маленькие кусочки XML, на самом деле у меня их(record) 14 с несчетным количеством реквизитов
По мере чтения XML-файла записываю данные в record
Например
Код:
TXML := TNativeXml.Create(nil);
PДокумент^.NUMBER := TXML.Root.FindNode('wb:NUMBER').Value;
Подскажите как мне правильно выделять память под record и потом правильно её очищать.
Как мне потом перебрать все record для сохранения их в БД или перебор у меня не получиться, если так то можно ли воспользоваться class?
tarakan1983 вне форума Ответить с цитированием
Старый 04.07.2016, 23:46   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

а зачем вам прослойки? сразу в базу и пишите
если надо то класс
come-on вне форума Ответить с цитированием
Старый 05.07.2016, 07:53   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Ну если с единичным документом, я бы работал прямо в XML (то есть класс), а так в БД.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 05.07.2016, 09:30   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

tarakan1983
Вы не правильно вопрос ставите. Надо писать что вы хотите сделать, что требуется. А не то как вы делаете. Во-вторых, главную часть вопроса надо писать в начале текста.

Цитата:
Подскажите как мне правильно выделять память под record и потом правильно её очищать.
Как мне потом перебрать все record для сохранения их в БД или перебор у меня не получиться, если так то можно ли воспользоваться class?
Выделение памяти GetMem освобождение FreeMem. Можно ещё new и Dispose
http://www.delphibasics.ru/New.php
Как правильно?
1) Где выделяем память там и освобождаем. Идеально если это в одной функции.
Или хотя бы в одном классе.
2) new-Dispose более безопасны чем GetMem и FreeMem
3) После выделения не забываем что надо очистить память.
FillChar(p^,SizeOf(p^),0);
В delphibasics, это забыли сделать.

Цитата:
можно ли воспользоваться class?
Можно.
Цитата:
Как мне потом перебрать все record для сохранения их в БД или перебор у меня не получиться,
Как перебрать ну к примеру так:
Код:
For i:=0 to List1.Count-1 do
  MyInserInBD('MyTableForList1',List1[i])
А вообще XML это и есть БД только древовидная, а не таблице видная. Так что нет никакого смысла пересылать в БД.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 05.07.2016, 09:33   #5
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от come-on Посмотреть сообщение
а зачем вам прослойки? сразу в базу и пишите
если надо то класс
XML большой, боюсь запутаться. Я сначала сохраняю Отправвителя, Получателя, Транспортную компанию, Водитель, Экспидитор, Автомобиль и т.п. получаю их ID, при этом в отдельных функциях проверяю на существование их в БД по отдельным реквизитам и при существовании обновляю текущими данными, сохраняю документ со всеми ID, у документа есть n-количество позиций товара со своими характеристиками(Производитель, импортер и т.п.) их тоже надо все сохранить и проверить на дубль в БД и потом только ID занести. Поэтому для наглядности и выбрал record, только не знаю как его правильно обнулять перед каждым новым XML и как его перебирать.
Цитата:
Сообщение от come-on Посмотреть сообщение
если надо то класс
А как class правильно обнулять перед каждым новым XML и как его перебирать?
tarakan1983 вне форума Ответить с цитированием
Старый 05.07.2016, 10:18   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если боишься запутаться, то проще динамические массивы записей:
Код:
Type 
TДокумент = record
      ID : Integer;
      NUMBER : AnsiString;
      ID_Получателя : Integer;
      ID_Отправителя : Integer;
    end;

var xDocuments: array of TДокумент;
SetLength для массива сам позаботится об выделении/освобождении памяти под записи. Сильно проще, но помедленнее. И ни каких колпачков, тоже большой полигон для запутывающихся. Еще проще вместо массивов использовать ClentDataSet и ClentDataSet.CreateDataSet. Соответственно еще чуть-чуть менее эффективно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 05.07.2016 в 10:22.
Аватар вне форума Ответить с цитированием
Старый 05.07.2016, 11:16   #7
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

21 век,а вы все записями...
Можно ведь ClientDataset пользовать:
В XML Mapping Toolе замутить нужный трансформ
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 05.07.2016, 11:36   #8
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
21 век,а вы все записями...
если автору надо просто кинуть в базу то и ClientDataset тут особо не нужен, xpath если совсем что то, и вперед
а если база сама умеет xml, то и делфи ненужная прослойка
come-on вне форума Ответить с цитированием
Старый 07.07.2016, 12:04   #9
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

попробуйте использовать XML Binding.
http://deldev.blogspot.ru/2008/05/xm...ng-delphi.html
Генерирует на основе xml распарсенный класс. Удобная вещь.
пример:XMLBinding_Example.zip
"ковыряю изнутри" (с)

Последний раз редактировалось 3D Hunter; 07.07.2016 в 12:06.
3D Hunter вне форума Ответить с цитированием
Старый 07.07.2016, 12:12   #10
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
попробуйте использовать XML Binding.
http://deldev.blogspot.ru/2008/05/xm...ng-delphi.html
Генерирует на основе xml распарсенный класс. Удобная вещь.
пример:Вложение 82593
Очень бы хотелось, но файлы XML кривые, он не хочет их парсить, уже пробовал, Ошибка вылетает.
Вот примеры файлов, можете сами попробовать?
P.S. Может у меня что-то кривое(руки, мозги и т.п.)
Вложения
Тип файла: rar 01.rar (6.4 Кб, 8 просмотров)
tarakan1983 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Class или Unit, что выбрать? Pcrepair Общие вопросы Delphi 3 01.02.2013 08:05
delphi XE2 Передать указатель на тип record в EnumWindows. Вылет в IntOverFlow или AV Человек_Борща Общие вопросы Delphi 8 12.02.2012 21:57
Ошибка " Record, object or class type required " (Запись, объектный или классический тип требовались) kta87 Помощь студентам 2 28.02.2010 10:04
Record, object or class type required @mazonk@ Помощь студентам 0 07.06.2009 13:03