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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

zealotfan



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
noisy
chAlx
Alexzzy
Спасибо за ответы. Попробую отдельной базой с blob-ами сделать. С файлами на сервере проблема возникла из-за прав доступа

Всего записей: 234 | Зарегистр. 25-02-2016 | Отправлено: 07:49 01-12-2016
FUTURiTY

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите как поменять пароль на Firebird 2.5 с "masterkey" на "m" ?
Логин стандартный - SYSDBA.
 
Спасибо.

Всего записей: 2948 | Зарегистр. 24-04-2007 | Отправлено: 11:55 22-12-2016
TuMOXA123

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gsec> modify SYSDBA -pw m

Всего записей: 456 | Зарегистр. 27-01-2003 | Отправлено: 12:55 22-12-2016
luxor



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите.
Есть CRM программа, работает на FB 1.5.5 SalesExpert и Win7x64.
Спустя год использования делаю дефрагментацию базы данных:
 
del backup.log
gbak.exe -b -user sysdba -pas masterkey se.fdb se.bck -y backup.log -g
del restore.log
gbak.exe -c -user sysdba -pas masterkey se.bck se.fdb -y restore.log -r -p 4096
 
но вот в restore.log появились строчки:
 
gbak: WARNING: function MULT3 is not defined
gbak: WARNING:     module name or entrypoint could not be found
gbak: WARNING: function MULT3 is not defined
gbak: WARNING:     module name or entrypoint could not be found
 
Как вылечить? Если что, прошу не ругаться, тема для меня новая.
Спасибо. С нетерпением жду....

Всего записей: 1706 | Зарегистр. 19-10-2004 | Отправлено: 23:16 12-01-2017
Shaman2

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

Цитата:
gbak: WARNING: function MULT3 is not defined
gbak: WARNING:     module name or entrypoint could not be found  

 
похоже пропада udf с функцией MULT3

Всего записей: 358 | Зарегистр. 18-07-2003 | Отправлено: 23:31 12-01-2017
luxor



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Shaman2
 
Точно! Не хватало caseudf.dll в UDF. БЛАГОДАРСТВУЮ!!!
А я то уже начал трястись за базу. Выручили!
 
Появился ещё вопрос.  
Стоит ли переходить на Firebird версией выше?  
Разраб на сайте велит (рекомендует) 1.5.5.4926.3-win32
Есть смысл?
Спасибо.

Всего записей: 1706 | Зарегистр. 19-10-2004 | Отправлено: 00:15 13-01-2017
Shaman2

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

Цитата:
Появился ещё вопрос.  
Стоит ли переходить на Firebird версией выше?  
Разраб на сайте велит (рекомендует) 1.5.5.4926.3-win32
Есть смысл?
Спасибо.

 
Если разраб рекомендует 1.5, то есть вероятность получить головную боль на старших версиях

Всего записей: 358 | Зарегистр. 18-07-2003 | Отправлено: 00:35 13-01-2017
romano501



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
noisy, zealotfan вклинюсь в разговор, уж простите.  

Цитата:
Переводишь руками или reFinde используешь?  

А что за reFinde такой используете для перехода с Fibplus?
Тоже столкнулся с необходимостью перевода с Fibplus на что-то живое
 

Всего записей: 137 | Зарегистр. 24-03-2007 | Отправлено: 16:04 11-07-2017
exteris

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

Цитата:
А что за reFinde такой

Консольная утилита. Идет со студией, не помню с какой версии.

Всего записей: 382 | Зарегистр. 14-04-2003 | Отправлено: 07:27 12-07-2017
romano501



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
exteris
Под студией имеется ввиду Embarcadero Delphi?

Всего записей: 137 | Зарегистр. 24-03-2007 | Отправлено: 11:01 12-07-2017
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Имеется таблица Table1, с полями id, Naimenovanie, Seriya, Kol-vo, Box. Когда записи добавляются, то одно поле (Box) имеет отличное значение. Но в процессе работы, у одной из записей, это поле становится (через Update) идентичным другой (типа переложили из одного ящика в другой). То есть, две записи отличаются только id и количеством (Kol-vo). Как можно огранизовать сложение количества этих записей и удаления второй? Догадываюсь, что это триггер на update и процедура? Может у кого пример есть?
Поле id нигде потом не задействовано, поэтому проблем быть не должно.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 15:47 12-07-2017 | Исправлено: Maximus777, 15:49 12-07-2017
romano501



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Если идет перекладывание из одного Box в другой, то в записи-источнике нужно уменьшить Box на Value (Box = Box -Value), а в записи-назначении нужно увеличить Box = Box+Value. Подозреваю, что команда Перекладывание из Box инициируется пользователем и должна быть оформлена как StoredProc чтобы в рамках одной транзакции провести корректировку 2-х записей.
А удаление записи - это уже совсем другая операция.
Но будет лучше если уточнишь контекст операции.

Всего записей: 137 | Зарегистр. 24-03-2007 | Отправлено: 17:02 12-07-2017
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
romano501
Всё так. При перекладывании происходит update записи и значение Box меняется. Например, становится "Ящик1". Но в таблице уже есть такой вариант, отличающийся только своим id.
 
Было:
20 Кирпич1 88 Ящик1
35 Кирпич1 100 Ящик2
 
Стало:
20 Кирпич1 88 Ящик1
35 Кирпич1 100 Ящик1
 
В итоге надо сделать:
20 Кирпич1 188 Ящик1
35 Кирпич1 0 Ящик1
 
А запись с id 35 можно в принципе и не убивать, т.к. выборка выводит только записи с ненулевым количеством.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 17:48 12-07-2017
romano501



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Непонятно зачем Ящик2 переименовали в Ящик1, ну да ладно
Суть не меняется. Пусть 2 записи сливаются в одну. Это все можно сделать в одном методе
Создай StoredProc с параметрами IDSRC, IDDST.  Его задача перенести value из IDSRC в IDDST.
IDDST это назначение (куда перекладывать) ID записи 20 Ящик1
IDSRC это источник (откуда перекладывать) ID записи 35 Ящик2 из твоего примера.  
В теле процедуры 1 update и 1 delete в рамках одной транзакции
valsrc = coalesce((select value from table where id=:IDSRC), 0);
update table
set value=value+valdst
where id=:IDDST;
delete from table
where id=:IDSRC;

Всего записей: 137 | Зарегистр. 24-03-2007 | Отправлено: 18:05 12-07-2017
zealotfan



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Создавай триггер before update и в нём пиши:
As
  declare variable id_box Integer;
begin
  --Ищем ID с таким же значением ящика(главное чтобы он был один иначе будет ошибка Multy)
  select table1.id  
  from table1  
  where table1.box = new.box
  into :id_box
  if :id_box > 0 then  --если такой ящик уже есть  
   begin
    update table1  
    set table1.Kolvo = table1.Kolvo + new.kolvo  
    where table1.id = :id_box; --увеличиваем количество в найденном ID  
   end
end
Насчёт удаления точно незнаю но в этом триггере наверное не будет работать и нужно создавать триггер after update и там уже удалять запись но можно и здесь попробовать после update поставить строку:
delete from table1 where table1.id = new.id
romano501
Если переводить не так много то лучше самому перевести всё руками, заодно узнаешь о новых фишках FIREDAC. А вообще есть новое видео по FIREDAC с семинара EMbarcadero для общего развития можно посмотреть " target=_blank>https://www.youtube.com/watch?v=AIM3wChhk9A
 

Всего записей: 234 | Зарегистр. 25-02-2016 | Отправлено: 07:46 13-07-2017
Dronton2

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

Цитата:
Стало:  
20 Кирпич1 88 Ящик1  
35 Кирпич1 100 Ящик1  
 
В итоге надо сделать:  
20 Кирпич1 188 Ящик1  
35 Кирпич1 0 Ящик1  

А чем вариант "Стало" отличается от варианта "надо сделать"?
В обоих случаях - две записи. В обоих случаях - чтобы узнать общее количество Кирпича1 в Ящике1, нужно делать сложение.
 
Имхо, неправильно сформулированная задача привела к неправильной реализации.
Первое, что нужно сделать - обеспечить уникальное сочетание полей Naimenovanie и Box. То есть, запретить существование в таблице Table1 двух записей с одинаковыми значениями в полях Naimenovanie и Box. Делается это созданием уникальных индексов или как-то иначе - не помню, т.к. уже лет 20 с интербэйзом не работаю.
 
Второе, что нужно сделать - это привести пользовательский интерфейс к регистрированию непосредственных действий пользователя, а не каких-то производных результатов этих действий или чего-то виртуального. Например, у вас пользователь изменяет значение Ящика для товара Кирпич1. А что он делает на самом деле?
Например, для перемещения товара из одного ящика в другой, пользовательский интерфейс должен передать в базу данных:
- наименование (а лучше - идентификатор) перемещённого товара
- количество перемещённого товара
- наименование (а лучше - идентификатор) ящика, из которого переместили
- наименование (а лучше - идентификатор) ящика, в который переместили
(- а дополнительно - идентификатор пользователя и дату-время данной операции, чтобы записать их в журнале, и если через некоторое время появится вопрос о несоответствии данных в базе, реальным данным, можно было бы сказать, кто, когда и какие изменения вносил в БД).
 
Получаем процедуру с 4 входными параметрами.
1. Открываем транзакцию
2. Получаем количество Кирпич1 в Ящик2.
3. Если это количество равно перемещаемому количеству - Удаляем запись для Кирпич1 и Ящик2
   Если это количество больше перемещаемого количества - записываем в запись для Кирпич1 и Ящик2 в поле Kol-vo разницу.
   Если это количество меньше перемещаемого количества - вызываем исключительную ситуацию, сообщаем об ошибке и откатываем транзакцию.
3. Используем оператор MERGE (или пользуемся аналогами UPDATE и INSERT) для добавления к существующей записи Кирпич1 и Ящик1 или создания новой записи, если такая запись отсутствует.
(4. Регистрируем перемещение товара в журнале)
5. Закрываем транзакцию.

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 11:15 13-07-2017 | Исправлено: Dronton2, 11:18 13-07-2017
romano501



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zealotfan
Благодарю за наводку. В этом видео как раз и reFind упоминается
 
Dronton2

Цитата:
А чем вариант "Стало" отличается от варианта "надо сделать"?  

Было:  
20 Кирпич1 88 Ящик1  
35 Кирпич1 100 Ящик2  
 
Стало:  
20 Кирпич1 88 Ящик1  
35 Кирпич1 100 Ящик1 <- Ящик2 становится Ящик1
 
Я не настаиваю на выборе конкретного варианта - по триггеру или процедура.  
Главное что проситель получил принцип решения задачи. Покумекает, прикинет, может и архитектуру переделает.

Всего записей: 137 | Зарегистр. 24-03-2007 | Отправлено: 12:59 13-07-2017
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем спасибо за ответы. Сделаю по совету Dronton2. Я как-то совсем упустил из виду, что мне в момент перемещения известны id обоих ящиков. Ступил. С кем не бывает?

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 14:56 13-07-2017
romano501



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

Всего записей: 137 | Зарегистр. 24-03-2007 | Отправлено: 15:00 13-07-2017
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
romano501
Вы сравниваете варианты "Было" и "Стало". Они отличаются.
Я сравнивал варианты "Стало" и "Надо сделать". Функционально они не различаются, т.к. для того, чтобы узнать, сколько Кирпичей1 в Ящике1, необходимо выполнить:
SELECT SUM("Kol-vo")
  FROM Table1
  WHERE Naimenovanie = 'Кирпич1' AND Box='Ящик1'
т.к. в таблице могут существовать несколько записей с одинаковыми значениями полей Naimenovanie и Box. И со временем количество таких записей будет увеличиваться. Это нехорошо, поэтому я предложил, чтобы БД гарантировала уникальность значений пары 'Naimenovanie и Box'.

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 11:12 14-07-2017
Открыть новую тему     Написать ответ в эту тему

Страницы: 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