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

Вниз

В selecte обработать строку.   Найти похожие ветки 

 
worldmen ©   (2006-08-22 12:40) [0]

Использую Firebird, локальный, и IBExpert.
Есть таблица клиентов, в ней фамилии имя и отчество полностью в отдельных полях.
Нужно что бы фамилия имя отчество выводилось в таком формате : Иванов И.И.
Т.е. имя отчество было сокращенным.
Я не нашел такой функции в Firebirdе.


 
ANB ©   (2006-08-22 12:42) [1]

substr ?


 
Сергей М. ©   (2006-08-22 12:45) [2]


> не нашел такой функции в Firebirdе


Даже если такой ф-ции нет, ничто не мешает решить задачу как минимум двумя обходными путями - реализовать такую ф-цию в своей UDF-библиотеке (или использовать готовую) и формировать результирующую строку уже на стороне клиента, получив от сервера полные имя, отчество и фамилию.


 
Dok   (2006-08-22 12:52) [3]


> Нужно что бы фамилия имя отчество выводилось в таком формате
> : Иванов И.И.

только на клиенте. нет смысла этим грузить сервер


 
Сергей М. ©   (2006-08-22 12:57) [4]


> Dok   (22.08.06 12:52) [3]


Ну почему же ?
В случае обработки на клиенте проигрываем в траффике, если это критично.
Вот уж что точно нежелательно - это использовать без крайней необходимости строковые ф-ции в составе PSQL.


 
worldmen ©   (2006-08-22 12:57) [5]

> ANB ©   (22.08.06 12:42) [1]
> substr

 Такой функции нет в Firebirdе

> реализовать такую ф-цию в своей UDF-библиотеке
Могу, конечно. Думал есть встроеная. Изобретать велосипед не хочется.
Если быть точным - то создать процедуру с выходным параметром, т.к. фцнкций там нет.


 
Dok   (2006-08-22 13:02) [6]


> В случае обработки на клиенте проигрываем в траффике, если
> это критично.

критично, но не очень.
Такие весчи должен делать клиент. Для отчета, грида и т.п. А сервер должен умные весчи делать - сортировку больших обьемов, расчет сумм, сложные выборки, но никак не подготавливать визуальный вид.


 
Сергей М. ©   (2006-08-22 13:03) [7]


> Изобретать велосипед не хочется


Ну посмотри среди готовых на ibase.ru


> создать процедуру с выходным параметром, т.к. фцнкций там
> нет


Ты про что ? Про UDF ? Или про ХП ?


 
Dok   (2006-08-22 13:06) [8]


>  Такой функции нет в Firebirdе

с чего бы это?


 
Val ©   (2006-08-22 13:24) [9]

>[6] Dok   (22.08.06 13:02)
почему не в обзоре?


 
Dok   (2006-08-22 13:37) [10]


> почему не в обзоре?

не зрозумив.


 
Val ©   (2006-08-22 13:46) [11]

>[10] Dok   (22.08.06 13:37)
чего именно?


 
Dok   (2006-08-22 13:58) [12]

Вашэ пытання


 
Val ©   (2006-08-22 14:08) [13]

тогда уж - вашого...
я спрашиваю - зачем заниматься этой ерундой на клиенте, если это, обработанное соответственно, поле можно просто добавить в обзор, который и будет отображать форма?


 
Dok   (2006-08-22 14:11) [14]


> я спрашиваю - зачем заниматься этой ерундой на клиенте,
> если это, обработанное соответственно, поле можно просто
> добавить в обзор, который и будет отображать форма?

потому что эта ерунда нужна клиенту. серверу нефиг этим заниматься.


 
atruhin ©   (2006-08-22 14:14) [15]

Вообще начиная с FB 1.5, SUBSTRING - работает.


 
yaral ©   (2006-08-22 14:19) [16]

А кто сказал что клиент может быть только один? Да и вообще в каждом НД, там где это может понадобиться, все это формировать? Один раз написал на сервере и забыл, и пользуешь везде где это поле нужно.
Я тригер написал который в отдельное поле заносит фамилию и инициалы, при внесении и изменении записи, т.к. постоянно грузить сервер вычислениями не хочеться, а такое поле много место не займет.

CREATE TRIGGER PERSPHI_IU FOR PERSPHI
ACTIVE BEFORE INSERT OR UPDATE POSITION 1
AS
DECLARE VARIABLE VLINI VARCHAR(30);
DECLARE VARIABLE VLFS VARCHAR(100);
BEGIN
 VLINI = "";
 VLFS  = "";

 IF (NOT NEW.L IS NULL) THEN
   BEGIN
     NEW.L=F_LTRIM(F_RTRIM(NEW.L));
     IF (NEW.L<>"") THEN
       BEGIN
         NEW.L = UPPERFIRST(NEW.L);
         VLINI = NEW.L;
         VLFS  = NEW.L;
       END
   END

 IF (NOT NEW.F IS NULL) THEN
   BEGIN
     NEW.F=F_LTRIM(F_RTRIM(NEW.F));
     IF (NEW.F<>"") THEN
       BEGIN
         NEW.F = UPPERFIRST(NEW.F);
         IF (:VLINI<>"") THEN
           BEGIN
             VLINI = :VLINI || " " || F_LEFT(NEW.F, 1) || ".";
             VLFS  = :VLFS  || " " || NEW.F;
           END
       END
   END

 IF (NOT NEW.S IS NULL) THEN
   BEGIN
     NEW.S=F_LTRIM(F_RTRIM(NEW.S));
     IF (NEW.S<>"") THEN
       BEGIN
         NEW.S = UPPERFIRST(NEW.S);
         IF ((:VLINI<>"") AND (NEW.F<>"")) THEN
           VLINI = :VLINI || F_LEFT(NEW.S, 1) || ".";
           VLFS  = :VLFS  || " " || NEW.S;
       END
   END

 UPDATE PERS
 SET SNAME = :VLINI,
     NAME  = :VLFS
 WHERE PERS_ID = NEW.PERS_ID;
END


F_LTRIM и прочие из FreeUDF


 
Dok   (2006-08-22 14:26) [17]


> yaral ©   (22.08.06 14:19) [16]

Мдя... А чуток подумать и сделать 3 поля? И потом если надо на клиенте конкатенацию сделать?


 
yaral ©   (2006-08-22 14:41) [18]

> Dok   (22.08.06 14:26) [17]
Дело твое, только вот постоянно делать это там где потребуется... это только в простых приложениях на таблицу клиентов используется один DataSet.
В чуть посложней оно часто нужно такое поле. И в сетках, и в Edit-ах, и в отчетах всевозможных, и что везде делать из трех полей? Заняться нечем больше?


 
Val ©   (2006-08-22 14:43) [19]

>[14] Dok   (22.08.06 14:11)
все что делает сервер, нужно клиенту - посоветуете все на клиенте и лопатить? :)


 
Сергей М. ©   (2006-08-22 14:52) [20]


> все что делает сервер, нужно клиенту


Все что сервер делает плохо (точнее - хуже клиента), клиенту не нужно)


 
Val ©   (2006-08-22 14:53) [21]

не к данному случаю.


 
yaral ©   (2006-08-22 14:56) [22]

> Сергей М. ©   (22.08.06 14:52) [20]
Наример обрабатывает и преобразует данные?


 
Dok   (2006-08-22 14:59) [23]


> все что делает сервер, нужно клиенту - посоветуете все на
> клиенте и лопатить? :)
>

почитайте внимательно [6]


 
Dok   (2006-08-22 15:01) [24]


> Дело твое, только вот постоянно делать это там где потребуется.
> .. это только в простых приложениях на таблицу клиентов
> используется один DataSet.
> В чуть посложней оно часто нужно такое поле. И в сетках,
>  и в Edit-ах, и в отчетах всевозможных, и что везде делать
> из трех полей? Заняться нечем больше?

не понял. Как три поля этому мешают? Ну сделай на клиенте конкатенацию и покажи юзверю. В чем трабл? А заставлять сервер парсить, то что с клиента и дет, когда клиент это может во много раз лучше - нефиг.


 
Dok   (2006-08-22 15:02) [25]


> Все что сервер делает плохо (точнее - хуже клиента), клиенту
> не нужно)

золотые слова :)


 
Сергей М. ©   (2006-08-22 15:04) [26]


> Val ©   (22.08.06 14:53) [21]
>
> не к данному случаю.


А ты замерь производительность PSQL-функции SubString и соответствующих ее аналогов в UDF или на клиенте (на достаточно большом НД) - сразу все встанет на свои места) .. А потом я объясню, почему наблюдается такая ощутимая разница в результатах замеров.


> yaral ©   (22.08.06 14:56) [22]
> Наример обрабатывает и преобразует данные?


Все зависит от условий, в которых будет востребованы обработка и преобразование.


 
Виталий Панасенко   (2006-08-22 15:33) [27]

computed by(fam||substring(im from 1 for 1)||"."||substring(ot from 1 for 1)||".")?


 
worldmen ©   (2006-08-22 16:15) [28]

СПАСИБО. С substring разобрался.
А вот насчет UDF-библиотек просветите.
Никогдо не использовал. Я перепутал с ХП.


 
Сергей М. ©   (2006-08-22 16:43) [29]


> worldmen ©   (22.08.06 16:15) [28]


На ibase.ru уже был ? Там есть предостаточно инф-ции о UDF: что это такое, с чем едят и т.д. и т.п.


 
worldmen ©   (2006-08-22 17:22) [30]

> Сергей М. ©   (22.08.06 16:43) [29]
Спасибо.



Страницы: 1 вся ветка

Текущий архив: 2006.10.22;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.046 c
2-1160235614
Iamdanil
2006-10-07 19:40
2006.10.22
Определить имя компьютера по имени сетевой папки


2-1159798459
Fostr
2006-10-02 18:14
2006.10.22
Вставка картинки в Excel


15-1159352528
Delphi basic
2006-09-27 14:22
2006.10.22
Переименование системной папки Windows


4-1149788245
Steplerr
2006-06-08 21:37
2006.10.22
С консолью через хендл


2-1159812270
Alral
2006-10-02 22:04
2006.10.22
Memo1.Text[1]:=