Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.034 c
6-1098604296
Jetus
2004-10-24 11:51
2005.01.16
Клиент-сервер на WinSock


3-1103184700
cad2206
2004-12-16 11:11
2005.01.16
Ошибка в SQL запросе?!


1-1103874094
Steepe Wolf
2004-12-24 10:41
2005.01.16
UTF-8 -> Win1251


14-1104159876
Alexander Panov
2004-12-27 18:04
2005.01.16
Оранжевая зараза уже в России.


1-1104294460
Новичек
2004-12-29 07:27
2005.01.16
Серийный номер жесткого диска.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский