Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ADOQuery. Подмена данных при их получении. [D6, WinME]


SergP ©   (2004-12-13 00:10:00) 

Есть ADOQuery с набором данных. Нужно при получении  с помощью Fields[N] или FieldByName('fieldname') их подменять. Т.е. например денежные значения мне нужно преобразовать в строку, где разделителем будет точка и после нее будет 2 знака, даты нужно получать тоже в виде строки в формате ДДММГГГГ (без разделителей), и т.п.

Какое событие есть для этого в ADOQuery и как определять в нем тип поля (чтобі знать что с ним делать далее)?


SergP   (2004-12-13 23:09:00) [1]


>  [9] Zacho ©   (13.12.04 23:04)


>  [11] Anatoly Podgoretsky ©   (13.12.04 23:07)


Спасибо. ИМХО это то что нужно.


Anatoly Podgoretsky   (2004-12-13 23:07:00) [2]

case AQExp.Fields[i].DataType of
  ftCurrency: AQExp.Fields[i].OnGetText := GetTextMoney;
  ftDate: AQExp.Fields[i].OnGetText := GetTextDate;
end;


также и для других типов


SergP   (2004-12-13 23:05:00) [3]


>  [8] Anatoly Podgoretsky ©   (13.12.04 23:00)
> Можно просканировать все поля и в зависимости от типа назначать
> тот или другой обработчик, пропуская не нужжные поля.
>
> AQExp.Fields[i].OnGetText := ...


Хорошо. А как определить тип поля?
У меня есть несколько таблиц с разной структурой. Данные могут выбираться из одной из этих таблиц, но заранее неизвестно из какой. Как можно определить тип поля ADOQuery.Fields[N] - где N- номер поля?


Zacho   (2004-12-13 23:04:00) [4]

SergP ©   (13.12.04 22:52) [7]
нужно знать какого типа является поле [N] в датасете. А как это определить - не знаю.


См. TField.DataType


Anatoly Podgoretsky   (2004-12-13 23:00:00) [5]

Можно просканировать все поля и в зависимости от типа назначать тот или другой обработчик, пропуская не нужжные поля.

AQExp.Fields[i].OnGetText := ...


SergP   (2004-12-13 22:52:00) [6]


>  [5] sniknik ©   (13.12.04 12:04)
> "запихивание" в XML делается как?
> передачей в другой подключенный к файлу XML? - OnGetText
> вполне подойдет, передавать будет уже нужное.
> или методом компонента savetofile? тогда желательно в рекордсет
> уже получить данные в нужном формате (в запросе преобразовать),
> если он конечно есть. тогда вопрос как эти данные туда попадают,
> не просто же "Есть ADOQuery с набором данных." откудато
> они туда попали.


Нет, не savetofile. Мне нужен файл в XML определенном формате который описан в определенном документе, куски из которого были приведены в моем предыдущем посте.

В данный момент "запихивание в XML произвожу с помощью TXMLDocument, типа так:


var
 XNodeL1,XNodeL2,XNodeL3:IXMLNode;
...
begin
 ...
 XNodeL2:=XNodeL1.AddChild('DECLARBODY');
 AQExp.Close;
 AQExp.SQL.Text:='select * from '+frm+' where parent_id='+inttostr(DocId);
 AQExp.Open;
 AQExp.First;
 while not AQExp.Eof do
   begin
   for i:=2 to AQExp.FieldCount-1 do
     begin
     XNodeL3:=XNodeL2.AddChild(AQExp.Fields[i].FullName);
     XNodeL3.Text:=AQExp.Fields[i].AsString;
     XNodeL3.Attributes['ROWNUM']:=inttostr(AQExp.RecNo);
     end;
   AQExp.Next;
   end;



>  [6] Anatoly Podgoretsky ©   (13.12.04 12:30)
> Два обработчика, один для денег и один для дат.


Согласен. Но как мне сделать все это попроще?
Полей-то много... Или делать длинный код, который вдруг что придется менять, либо можно сделать немного проще, но нужно знать какого типа является поле [N] в датасете. А как это определить - не знаю.


Anatoly Podgoretsky   (2004-12-13 12:30:00) [7]

Два обработчика, один для денег и один для дат.


sniknik   (2004-12-13 12:04:00) [8]

"запихивание" в XML делается как?
передачей в другой подключенный к файлу XML? - OnGetText вполне подойдет, передавать будет уже нужное.
или методом компонента savetofile? тогда желательно в рекордсет уже получить данные в нужном формате (в запросе преобразовать), если он конечно есть. тогда вопрос как эти данные туда попадают, не просто же "Есть ADOQuery с набором данных." откудато они туда попали.


Zacho   (2004-12-13 10:40:00) [9]

SergP ©   (13.12.04 10:01) [3]
Хм. Оно оказывается не на весь датасет а на отдельное поле... Это хуже...


А чем хуже-то ? Можешь сделать одинобработчик на все поля. И оперировать параметром Sender:TField


SergP   (2004-12-13 10:01:00) [10]


>  [1] Anatoly Podgoretsky ©   (13.12.04 00:15)
> TField.OnGetText


Хм. Оно оказывается не на весь датасет а на отдельное поле... Это хуже...
Наверное придется вручную изсенять уже после получения данных из датасета.


>  [2] Johnen   (13.12.04 02:44)
> или DisplayFormat
> Следует четко разделять значения данных и их отображение.


Нет. меня не отображение интересует. Нужно некоторые данные из базы экспортировать в XML формате, а там есть такие требования (времения нет переводить с украинского, на работу опаздываю).:


Основні вимоги до заповнення значень показників є такими:

1.   Значення показників грошового типу  заповнюються в гривнях з копійками. Роздільником десяткових розрядів обов'язково є крапка. Якщо значення показника дорівнює нулю, то воно записується як <Код показника>0.00</ Код показника>
...
3.       Значення показників типу “дата” зберігаються у форматі ддммрррр, де дд- день, мм-місяць, а рррр- рік.

Наприклад: 15 січня 2004 року запишеться у вигляді 15012004.


Поэтому данные полученные из датасета перед "запихиванием" в XML нужно привести в соответствующий вид. Только как это сделать попроще я пока не знаю, дело в том что полей в датасете много.


Johnen   (2004-12-13 02:44:00) [11]

или DisplayFormat
Следует четко разделять значения данных и их отображение.


Anatoly Podgoretsky   (2004-12-13 00:15:00) [12]

TField.OnGetText


Наверх

Титульная страница Поиск, карта сайта Написать письмо