Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» InterBase и FireBird: вопросы по работе и их решение

Автор: AlexCoRu
Дата сообщения: 17.11.2011 17:17

Цитата:
чем UNIQUE CONSTRAINT не угодил?
Пытался создать, но в таблице уже были одинаковые EAN и индекс не создавался. Думал, что из за записей с null. Оставил только уникальные и сработало:

Код: ALTER TABLE PRODUCTION
ADD CONSTRAINT UNQ_PRODUCTION_EAN UNIQUE (EAN)
USING INDEX PRODUCTION_EAN_IDX;
Автор: Master9000
Дата сообщения: 17.11.2011 22:11
забыт пароль к sysdba он был изменен
какими путями можно скинуть на стандарт либо восстановить
firebird 1.5.0
Автор: YuriyRR
Дата сообщения: 17.11.2011 22:54
Master9000
Установи новую копию сервера и возьми из нее security.fdb для замены в старом
Автор: X11
Дата сообщения: 18.11.2011 10:12
Переустановить FB
Автор: Arvur
Дата сообщения: 21.11.2011 08:06
Master9000
Переустанавливать не обязательно. Просто скачай zip-архив соответствующей версии.
Останови firebird (важно!) и замени security.fdb из архива.
Если были заведены другие пользователи, они при этом пропадут.
Автор: Master9000
Дата сообщения: 21.11.2011 19:34
вот где бы сейчас достать firebird 1.5.0
Автор: volser
Дата сообщения: 21.11.2011 19:50
Master9000
Firebird 1.5
Автор: MagistrAnatol
Дата сообщения: 24.11.2011 11:55
Народ, подсобите с запросом
Table1 - мастер таблица
FIO
...
Table1_ID

Table2 детал таблица
Table1_ID,
Table2_ID,
Kolvo
........
Table2_ID

Table3 справочник наименований
Tovar_Name
.....
Table3_ID

Table4
Tovar_Type_Name
Tovar_Type может быть от 1 до 6
Table4_ID

Так вот надо составить запрос и разместить данные по горизонтали в зависимости от Tovar_Type
типа такой таблички
| Tovar_Type=1 | Tovar_Type=2 | .... | Tovar_Type=6 |
FIO|TovarName|Kolvo|TovarName|Kolvo| .... |TovarName|Kolvo|
Автор: GloThin
Дата сообщения: 24.11.2011 12:26
MagistrAnatol
НУ связь первых двух таблиц видно -
Цитата:
Table1_ID,

А остальные то как связаны?


Цитата:
Так вот надо составить запрос

Это один вопрос.


Цитата:
разместить данные по горизонтали в зависимости от Tovar_Type
типа такой таблички

А это уже другой вопрос.

Это уже не к запросу, а скорее всего к форме вывода данных по результату запроса...
В отчете, или на форме, или еще где-нить.
Запрос не формирует табличку... Это только набор данных, а как ты их размещать - другое дело.
Автор: MagistrAnatol
Дата сообщения: 24.11.2011 13:40
GloThin
блин, упустил ключевые поля
Table1 - мастер таблица
FIO
...
Table1_ID

Table2 детал таблица
Table1_ID,
Table3_ID,
Kolvo
........
Table2_ID

Table3 справочник наименований
Tovar_Type
Tovar_Name
.....
Table3_ID

Table4
Tovar_Type_Name
Tovar_Type может быть от 1 до 6
Table4_ID


Цитата:
Запрос не формирует табличку... Это только набор данных, а как ты их размещать - другое дело.

немного не согласен - любой запрос возвращает "табличку" данных
смотри, при
select fio,Tovar_Type_Name ,Tovar_Name ,Kolvo from Table1
left join Table2 on Table1.Table1_ID=Table2.Table1_ID
left join Table3 on Table2.Table3_ID=Table3.Table3_ID
left join Table4 on Table3.Tovar_Type=Table4.Tovar_Type
я получаю табличку
fio|Tovar_Type_Name|Tovar_Name |Kolvo|
и как ты не крути из етого запроса ты не сможеш получить отчет вида
| Tovar_Type=1 | Tovar_Type=2 | .... | Tovar_Type=6 |
FIO|TovarName|Kolvo|TovarName|Kolvo| .... |TovarName|Kolvo|


Добавлено:
точнее даже так
| Tovar_Type_Name(Tovar_Type=1) |Tovar_Type_Name(Tovar_Type=2)| ....
FIO|TovarName |Kolvo |TovarName |Kolvo | ....
Автор: volser
Дата сообщения: 24.11.2011 13:59
MagistrAnatol
Это кросс-таблица. Можно получить в любом генераторе отчета, например в FastReport.
Автор: Arvur
Дата сообщения: 24.11.2011 14:21
Не вчитывался в запросы но для кросс-таблиц могут пригодиться OLAP-генераторы: FastCube/HierCube/RadarCube. Все пробегали в варезнике.
Автор: MagistrAnatol
Дата сообщения: 24.11.2011 15:23
volser
вполне возможно, но как мне в том же редакторе кросс объекта фастрепорта задать условия

Цитата:
| Tovar_Type_Name(Tovar_Type=1) |Tovar_Type_Name(Tovar_Type=2)| ....

в упор не вижу такого
Автор: volser
Дата сообщения: 24.11.2011 15:27
MagistrAnatol
Фильтровать нужно запрос, сам генератор только отображает данные в нужном виде.
Автор: MagistrAnatol
Дата сообщения: 24.11.2011 15:39
блин, томожу, никогда не пользовался крос отчетами, потихоньку доходит.
Ну а sql запросом реально реализовать мою задачу??

Добавлено:
volser
только как?
никак не выходит у меня создать кросс запрос
Автор: wasilissk
Дата сообщения: 24.11.2011 16:34
MagistrAnatol

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

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

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

А если товаров определённого типа Tovar_Type не было, колонка для этого типа всё-равно должна быть? Т.е. колонок для типов всегда 6?

Добавлено:
Раз уж вопрос в теме по firebird, то надо делать процедуру.
Автор: exteris
Дата сообщения: 25.11.2011 07:15
Если количество типов товара постоянно, то имеет смысл посмотреть в сторону 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,
...

Автор: MagistrAnatol
Дата сообщения: 25.11.2011 08:02
exterisда постоянное
AlexCoRu
да, есть 6 типов, а будет ли какой-то из типов у какого-то ФИО не известно, могут быть и все - теоретически.
Ты клониш к тому чтобы изменить структуру таблицы из вертикали в горизонталь? - тогда нарушается вся логика мастер-деталь таблиц


Добавлено:
exteris
такой вариант подходит по логике - выбирает как нужно, только плохо что в одном case нельзя вернуть
3 колонки, надо будет сварганить минимум 18 кейсов
Автор: OXDBA
Дата сообщения: 25.11.2011 08:44
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
Автор: AnViSe
Дата сообщения: 25.11.2011 09:31
Есть набор данных:

FIO-поле
Сидоров С.С.
Иванов И.И.
Петров П.П.

Каким запросом можно вытянуть только Имя?
Чтобы в результате было что-то вроде:

С
И
П

Копал в сторону SUBSTRING, но как определить позицию определенного символа в строке?
З.Ы. FireBird 2.1
Автор: MagistrAnatol
Дата сообщения: 25.11.2011 09:33
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
Автор: X11
Дата сообщения: 25.11.2011 09:55

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



Код:

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 ; ^

Автор: AnViSe
Дата сообщения: 25.11.2011 10:09
Я тоже рассматривал варианты с использованием процедуры или внешней функции. Просто хотелось узнать может есть встроенная...
Автор: Arvur
Дата сообщения: 25.11.2011 10:30
AnViSe
В FB2.1 появилась встроенная функция POSITION.
Точно описана в Firebird-2.5-LangRef-Update
Автор: AnViSe
Дата сообщения: 25.11.2011 10:44
Хм, действительно есть такая встроенная функция.

Спасибо за наводку. Хотя в документации идущей с самим сервером про нее не говорится, или я плохо искал.
Автор: MagistrAnatol
Дата сообщения: 29.11.2011 10:00
Народ, можно как-то в селекте задать какие колонки выводить по условию ???
Автор: Coltrain
Дата сообщения: 29.11.2011 10:18
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
Автор: MagistrAnatol
Дата сообщения: 01.12.2011 14:11
Coltrain

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

да, подойдет пасибо
Автор: AlexCoRu
Дата сообщения: 23.12.2011 10:19
Нужно вычислить начальный и конечный 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

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465

Предыдущая тема: Сравнение двух строк


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.