![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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