Главная страница
    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.49 MB
Время: 0.041 c
10-1080654787
ai
2004-03-30 17:53
2005.01.16
Быстродействие Excel


14-1104073643
Чеширский_Кот
2004-12-26 18:07
2005.01.16
Подскажите ресурс!


14-1104311035
Егор
2004-12-29 12:03
2005.01.16
Настолные игры для локальки


14-1104205695
Sunshine
2004-12-28 06:48
2005.01.16
Репрессии против участников поморанчевого пикета в Москве


3-1103184184
Sergo
2004-12-16 11:03
2005.01.16
IBDataBase





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский