Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.042 c
1-1104221625
Floppy
2004-12-28 11:13
2005.01.16
Master-Detail QuickReport


14-1104224008
Mike Kouzmine
2004-12-28 11:53
2005.01.16
Первая ласточка свободы


1-1103885159
Дитё
2004-12-24 13:45
2005.01.16
Можно ли по объекту узнать в каком модуле он объявлен ?


4-1101715712
zetovich
2004-11-29 11:08
2005.01.16
Сделать недоступным "Панель задач", "кн Пуск"


4-1101376787
snake1977
2004-11-25 12:59
2005.01.16
EnumWindows ненахдит окно