Форум: "Базы";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизADOQuery. Подмена данных при их получении. Найти похожие ветки
← →
SergP © (2004-12-13 00:10) [0]Есть ADOQuery с набором данных. Нужно при получении с помощью Fields[N] или FieldByName("fieldname") их подменять. Т.е. например денежные значения мне нужно преобразовать в строку, где разделителем будет точка и после нее будет 2 знака, даты нужно получать тоже в виде строки в формате ДДММГГГГ (без разделителей), и т.п.
Какое событие есть для этого в ADOQuery и как определять в нем тип поля (чтобі знать что с ним делать далее)?
← →
Anatoly Podgoretsky © (2004-12-13 00:15) [1]TField.OnGetText
← →
Johnen (2004-12-13 02:44) [2]или DisplayFormat
Следует четко разделять значения данных и их отображение.
← →
SergP © (2004-12-13 10:01) [3]
> [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 нужно привести в соответствующий вид. Только как это сделать попроще я пока не знаю, дело в том что полей в датасете много.
← →
Zacho © (2004-12-13 10:40) [4]SergP © (13.12.04 10:01) [3]
Хм. Оно оказывается не на весь датасет а на отдельное поле... Это хуже...
А чем хуже-то ? Можешь сделать один обработчик на все поля. И оперировать параметром Sender:TField
← →
sniknik © (2004-12-13 12:04) [5]"запихивание" в XML делается как?
передачей в другой подключенный к файлу XML? - OnGetText вполне подойдет, передавать будет уже нужное.
или методом компонента savetofile? тогда желательно в рекордсет уже получить данные в нужном формате (в запросе преобразовать), если он конечно есть. тогда вопрос как эти данные туда попадают, не просто же "Есть ADOQuery с набором данных." откудато они туда попали.
← →
Anatoly Podgoretsky © (2004-12-13 12:30) [6]Два обработчика, один для денег и один для дат.
← →
SergP © (2004-12-13 22:52) [7]
> [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 23:00) [8]Можно просканировать все поля и в зависимости от типа назначать тот или другой обработчик, пропуская не нужжные поля.
AQExp.Fields[i].OnGetText := ...
← →
Zacho © (2004-12-13 23:04) [9]SergP © (13.12.04 22:52) [7]
нужно знать какого типа является поле [N] в датасете. А как это определить - не знаю.
См. TField.DataType
← →
SergP © (2004-12-13 23:05) [10]
> [8] Anatoly Podgoretsky © (13.12.04 23:00)
> Можно просканировать все поля и в зависимости от типа назначать
> тот или другой обработчик, пропуская не нужжные поля.
>
> AQExp.Fields[i].OnGetText := ...
Хорошо. А как определить тип поля?
У меня есть несколько таблиц с разной структурой. Данные могут выбираться из одной из этих таблиц, но заранее неизвестно из какой. Как можно определить тип поля ADOQuery.Fields[N] - где N- номер поля?
← →
Anatoly Podgoretsky © (2004-12-13 23:07) [11]
case AQExp.Fields[i].DataType of
ftCurrency: AQExp.Fields[i].OnGetText := GetTextMoney;
ftDate: AQExp.Fields[i].OnGetText := GetTextDate;
end;
также и для других типов
← →
SergP © (2004-12-13 23:09) [12]
> [9] Zacho © (13.12.04 23:04)
> [11] Anatoly Podgoretsky © (13.12.04 23:07)
Спасибо. ИМХО это то что нужно.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.038 c