Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » InterBase и FireBird: вопросы по работе и их решение

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104

Открыть новую тему     Написать ответ в эту тему

wasilissk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MagistrAnatol

Цитата:
только как?

Обычный селект, который свяжет все данные, которые необходимо вывести. В качестве горизонтальной составляющей Tovar_Type_Name, в качестве вериткальной FIO и Kolvo.

Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 18:34 24-11-2011
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Tovar_Type может быть от 1 до 6

А если товаров определённого типа Tovar_Type не было, колонка для этого типа всё-равно должна быть? Т.е. колонок для типов всегда 6?
 
Добавлено:
Раз уж вопрос в теме по firebird, то надо делать процедуру.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 20:57 24-11-2011
exteris

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Если количество типов товара постоянно, то имеет смысл посмотреть в сторону CASE.
Типа:  
select fio, case when tovar_type=1 then kol else 0,
               case when tovar_type=2 then kol else 0,
               case when tovar_type=3 then kol else 0,
...
 

Всего записей: 382 | Зарегистр. 14-04-2003 | Отправлено: 09:15 25-11-2011
MagistrAnatol



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
exterisда постоянное
AlexCoRu
да, есть 6 типов, а будет ли какой-то из типов у какого-то ФИО не известно, могут быть и все - теоретически.
Ты клониш к тому чтобы изменить структуру таблицы из вертикали в горизонталь? - тогда нарушается вся логика мастер-деталь таблиц
 
 
Добавлено:
exteris
такой вариант подходит по логике - выбирает как нужно, только плохо что в одном case нельзя вернуть
3 колонки, надо будет сварганить минимум 18 кейсов

Всего записей: 2120 | Зарегистр. 09-04-2003 | Отправлено: 10:02 25-11-2011
OXDBA

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MagistrAnatol

Код:
 
select fio,
       iif(tovar_type = 1, t3.tovar_name, 0) TOVAR1_NAME,
       iif(tovar_type = 1, t2.kolvo, 0) TOVAR1_KOLVO,
       iif(tovar_type = 2, t3.tovar_name, 0) TOVAR2_NAME,
       iif(tovar_type = 2, t2.kolvo, 0) TOVAR2_KOLVO,
       iif(tovar_type = 3, t3.tovar_name, 0) TOVAR3_NAME,
       iif(tovar_type = 3, t2.kolvo, 0) TOVAR3_KOLVO,
       iif(tovar_type = 4, t3.tovar_name, 0) TOVAR4_NAME,
       iif(tovar_type = 4, t2.kolvo, 0) TOVAR4_KOLVO,
       iif(tovar_type = 5, t3.tovar_name, 0) TOVAR5_NAME,
       iif(tovar_type = 5, t2.kolvo, 0) TOVAR4_KOLVO,
       iif(tovar_type = 6, t3.tovar_name, 0) TOVAR6_NAME,
       iif(tovar_type = 6, t2.kolvo, 0) TOVAR6_KOLVO
  from table2 t2
  join table1 t1 on t2.table1_id = t1.table1_id
  join table3 t3 on t2.table3_id = t3_table3_id
 


Всего записей: 426 | Зарегистр. 19-01-2005 | Отправлено: 10:44 25-11-2011
AnViSe



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть набор данных:
 
FIO-поле
Сидоров С.С.
Иванов И.И.
Петров П.П.
 
Каким запросом можно вытянуть только Имя?
Чтобы в результате было что-то вроде:
 
С
И
П
 
Копал в сторону SUBSTRING, но как определить позицию определенного символа в строке?
З.Ы. FireBird 2.1

Всего записей: 123 | Зарегистр. 10-11-2008 | Отправлено: 11:31 25-11-2011
MagistrAnatol



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
OXDBA
почти оно, за исключением на одно ФИО  несколько строк
 
 
Добавлено:
всем принявшим участие огромный сенкс
вот запрос с sql.ru, мож кому пригодиться,exteris отдельное пасиб за идею
 
select t1.fio,
       max(case when p.produktid = 1 then p.produkt end) as Pr1,
       sum(case when p.produktid = 1 and t3.isvkl = 0 then t3.kvo else 0 end) Pr1_vkl,
       sum(case when p.produktid = 1 and t3.isvkl = 1 then t3.kvo else 0 end) Pr1_vikl,
 
       max(case when p.produktid = 2 then p.produkt end) as Pr2,
       sum(case when p.produktid = 2 and t3.isvkl = 0 then t3.kvo else 0 end) Pr2_vkl,
       sum(case when p.produktid = 2 and t3.isvkl = 1 then t3.kvo else 0 end) Pr2_vikl,
 
       max(case when p.produktid = 3 then p.produkt end) as Pr3,
       sum(case when p.produktid = 3 and t3.isvkl = 0 then t3.kvo else 0 end) Pr3_vkl,
       sum(case when p.produktid = 3 and t3.isvkl = 1 then t3.kvo else 0 end) Pr3_vikl
  from produkt p
       join table1 t1 on 1 = 1
       left join table3 t3 on t3.produktid = p.produktid and t3.table1id = t1.table1id
  group by 1

Всего записей: 2120 | Зарегистр. 09-04-2003 | Отправлено: 11:33 25-11-2011
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
как определить позицию определенного символа в строке?

 

Код:
 
 
SET TERM ^ ;
 
create or alter procedure POS (
    STR varchar(100),
    SUB_STR varchar(100))
returns (
    P integer)
as
begin
  p = 0;
  if ((str is null) or (SUB_STR is null))  then begin
    suspend;
    exit;
  end
  while (char_length(str) >= char_length(sub_str)) do begin
    p = p+1;
 
    if (substring(str from 1 for char_length(sub_str)) = sub_str) then begin
      suspend;
      exit;
    end
    str = substring(str from 2 for char_length(str));
  end
  p = 0;
--  suspend;
end^
 
SET TERM ; ^
 
 

 
Добавлено:
Возможно, что в FB 2.1/2.5 уже есть что-то встроенное

----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 11:55 25-11-2011
AnViSe



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я тоже рассматривал варианты с использованием процедуры или внешней функции. Просто хотелось узнать может есть встроенная...

Всего записей: 123 | Зарегистр. 10-11-2008 | Отправлено: 12:09 25-11-2011
Arvur



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
AnViSe
В FB2.1 появилась встроенная функция POSITION.
Точно описана в Firebird-2.5-LangRef-Update

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 12:30 25-11-2011
AnViSe



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хм, действительно есть такая встроенная функция.
 
Спасибо за наводку. Хотя в документации идущей с самим сервером про нее не говорится, или я плохо искал.

Всего записей: 123 | Зарегистр. 10-11-2008 | Отправлено: 12:44 25-11-2011
MagistrAnatol



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Народ, можно как-то в селекте задать какие колонки выводить по условию ???

Всего записей: 2120 | Зарегистр. 09-04-2003 | Отправлено: 12:00 29-11-2011
Coltrain

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MagistrAnatol

Цитата:
можно как-то в селекте задать какие колонки выводить по условию ?

 
В смысле, на место одной колонки подставлять значения из разных колонок? Тогда подойдет оператор Case. Типа
 
select sl.po_number,
  case sl.order_status
    when 'open' then sl.price1
    when 'waiting' then sl.pice2
    when 'shipped' then sl.price3
    else cast(0 as numeric(18,2))
  end as price
 from sales sl

Всего записей: 160 | Зарегистр. 31-07-2002 | Отправлено: 12:18 29-11-2011
MagistrAnatol



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Coltrain

Цитата:
В смысле, на место одной колонки подставлять значения из разных колонок?

да, подойдет пасибо

Всего записей: 2120 | Зарегистр. 09-04-2003 | Отправлено: 16:11 01-12-2011
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужно вычислить начальный и конечный ip адреса по адресу и маске сети. Пробую так, не получается:

Код:
create or alter procedure NODES_SELECT_SUBNET (
    SUBNET_ADDR bigint not null,
    SUBNET_MASK bigint)
declare variable IP_ADDR bigint;
declare variable IP_MAX bigint;
begin
  IP_ADDR = bin_and(SUBNET_ADDR, SUBNET_MASK) + 1;
  IP_MAX = bin_or(bin_and(IP_ADDR, SUBNET_MASK), bin_not(SUBNET_MASK)) - 1;
end

IP_MAX получается отрицательным. FB 2.5.1.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 12:19 23-12-2011 | Исправлено: AlexCoRu, 12:19 23-12-2011
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот так получилось:
Код:
IP_MAX = bin_or(bin_and(IP_ADDR, SUBNET_MASK), bin_and(bin_not(SUBNET_MASK), 0x00000000FFFFFFFF)) - 1;

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 14:39 23-12-2011
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Andryshok
Спасибо всё получилось, FB рулит, жаль проект отобрали. CSharp делает корявый SQL но его можно неоднократно использовать и масштабировать. Вобщем спасибо.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 23:27 25-12-2011
vetal71



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
всем привет.  
кто нибудь пробовал импортировать данные из Dbf в FB используя IBEBlock функцию ibec_ImportData ?
никак не получается использовать опцию Mappings.

Всего записей: 299 | Зарегистр. 08-09-2008 | Отправлено: 12:03 26-12-2011
exteris

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
vetal71
Как делаете?

Всего записей: 382 | Зарегистр. 14-04-2003 | Отправлено: 08:16 27-12-2011
vetal71



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
exteris
вот текст ibeblock  

Код:
 
execute ibeblock
as
begin
  cbb = 'execute ibeblock (RecCount variant)
         as
         begin
           if (ibec_Mod(RecCount, 100) = 0) then
             ibec_Progress(RecCount || '' records imported.'');
         end;';
   
  DB = ibec_CreateConnection(__ctFirebird, 'DBName="D:\Reception\Data\Reception.fdb";
                                            ClientLib=gds32.dll;
                                            User=SYSDBA; Password=masterkey; Names=WIN1251; SqlDialect=3;');
  try
    ibec_UseConnection(DB);  
 
    Res = ibec_ImportData(DB, 'F1012011', __impDBase, 'D:\Balon\F1012011.DBF', '',  
                          'RowFirst=1; RowLast=2147483647;
                           DateOrder=DMY; DateSeparator="."; TimeSeparator=":"; OemToAnsi;',  
                           '1=1; 2=2; 3=3;4=4;5=5', cbb);
   
    if (Res is not null) then
      ibec_ShowMessage(Res || ' записей импортировано успешно в таблицу F1012011.');
         
  finally
    ibec_CloseConnection(DB);
  end;
end
 

 
здесь я пытаюсь импортировать 5 столбцов. Пытаюсь обойти проблемку. Дело в том что в dbf таблице поле обозвано "TO", то есть столбец с зарезервированным именем, соответственно на этом поле выдает ошибку. Может кто знает как это сделать. Можно конечно импорт сделать другими средствами, но мне хотелось бы реализовать через ibeblock

Всего записей: 299 | Зарегистр. 08-09-2008 | Отправлено: 09:22 27-12-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » InterBase и FireBird: вопросы по работе и их решение


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru