Quantcast
Channel: SQL.ru: Firebird, InterBase
Viewing all 1677 articles
Browse latest View live

select count(*) from table1 left join table2

$
0
0
Кхм, простое дело, а чет уперся в тупик. Как правильно составить запрос?

select count(*) from table1 a
left join table2 b on a.b_id=b.id
where b.name="блаблабла"

FB 2.5, 1 диалект

Норвежская сортировка

$
0
0
Привет всем.
Немогу понять что делать чтоб заставить сортировать по норвежскому альфабиту.
Какую то норвежскую кодировку как то ненахожу негде...

WBR
Janex

ODBC Firebird Driver "Count field incorrect" после обновления на Win10.1803

$
0
0
Добрый день.

После самопроизвольного :) обновления Windows 10 до версии 1803 перестал работать макрос VBA c firebird 2.5.
При этом доступ на чтение остался, вот вставка\обновление записей выполнить не получается.

Вываливается с ошибкой

ODBC Firebird Driver "Count field incorrect"


Такое уже случалось 3 месяца назад, в тот раз откат системы помог. Но не постоянно же откатываться..
Может есть возможность заставить работать клиента firebird на версии Win10.1803 ?

Разрядность драйвера к Firebird

$
0
0
Hello world!

Есть хост с установленным на него х64 сервером Firebird 2.5.2 (Windows Build)
На втором хосте/клиенте(windows Server 2008 R2 Datacenter, 64-bit) установлен какой-то драйвер под Firebird.
Мне нужно понять какая у него разрядность, что бы создать DSN, с правильной разрядностью.

На клиенте из Task Manager-->Prosses вижу
fbguard.exe
fbserver.exe
Далее запускаю odbcad.exe
1. из папки C:Windows\System32, на вкладке Drivers вижу

Name Version Company File Date
FireBird/InterBase(r) driver 2.00.02.152 Firebird Prodject ODBCFB.DDL 7/3/2013


2. из папки C:Windows\SysWOW64, на вкладке Drivers вижу
Name Version Company File Date
FireBird/InterBase(r) driver 2.00.02.152 Firebird Prodject ODBCFB.DDL 7/3/2013


Есть идеи, как определить разрядность у драйвера?
Будет ли работать ODBC коннектор, если в нем использовать x64 DSN, а драйвер 32-разрядный?

Запрос не видит изменения данных таблицы

$
0
0
Доброго времени суток!

Столкнулся почти с той же проблемой что описана тут.
На HTTP сервер приходит два запроса, почти одновременно (даже секунды совпадают), один post запрос, который обрабатывает данные и заполняет таблицу, второй get запрос, который по результатам выборки из таблицы, выдает информацию.
Второй запрос (get) выбирает данные из таблицы которую изменил первый (post) и не видит изменений. только если я сделаю обновление страницы, тогда все ОК, и видны измененные данные.

Попробовал установить параметры транзакции как в той теме, т.е. для записи
$tr=ibase_trans(IBASE_CONCURRENCY | IBASE_NOWAIT, self::$connection);

и для читающей
IBASE_READ || IBASE_COMMITTED || IBASE_REC_VERSION || IBASE_NOWAIT


Все равно нет изменений, пока не сделаешь обновление страницы.
поставил IBExpert, последить за транзакциями, думал зависают - все ОК.
сделал цикл ожидания при обработке get запроса
....
$b->Load($Id); //загрузка данных из БД
$i=10;
While (($i>0) &&($b->STATUS=='A'))
{
  $i=$i-1;
  sleep(1);
 $b->Load($id);
}
....

не помогает, все равно значение не изменяется, ставил $i=60, чтобы успеть сделать выборку в другой программе и посмотреть состояние поля записи. Поле изменено, все ОК, но при обработке get запроса, оно остается в старом состоянии.
только после обновления страницы все ОК и поле меняет значение. Добавлял в цикл ожидания,перед выборкой, реконект к базе, т.е. закрывал соединение и открывал снова
 ibase_close(firebird::$connection);
 firebird::Connect(); 
 $b->Load($id);

Результат - 0, т.е. поле не измено, хотя как я писал выше, в другой программе делаю выборку и вижу прекрасно, что поле измено.
Попробовал сделать редирект при обработке get запроса (после обновления же изменения видны) - результат 0, т.е. тоже нет изменений.

Помогите, целый день убил на эту проблему, уже не знаю куда копать. Транзакции и так и так пробовал :(
Может что не так с версией PHP или ОС?
Использую OpenSuse 42.3 и PHP 5.5.14, firebird 2.5

Тест скорости получения данных из ХП, функций и RDB$GET_CONTEXT

$
0
0
FB 3.0. Начал делать перевод некоторых ХП, возвращающих одно значение, во внутренние функции. Ради интереса решил померить их производительность.
Что тестируется:
1. Получение одной строки и одного параметра из ХП, которая берет данные из RDB$GET_CONTEXT - SP$GET_ID_USER.
2. Получение одной строки и одного параметра из ХП, которая возвращает одно и то же число - SP$GET_ID_USER_CONST.
3. Функция без флага DETERMINISTIC, возвращающая значение из RDB$GET_CONTEXT - CONNECT_ID_USER_NOT_DETER.
4. Функция без флага DETERMINISTIC, возвращающая одно и то же число - CONNECT_ID_USER_CONST_NOT_DETER.
5. Функция c флагом DETERMINISTIC, возвращающая значение из RDB$GET_CONTEXT - CONNECT_ID_USER_DETER.
6. Функция c флагом DETERMINISTIC, возвращающая одно и то же число - CONNECT_ID_USER_CONST_DETER.
7. Получение значения из RDB$GET_CONTEXT.
8. Прямое присвоение значения.

+
Скрипт метаданных:
SET TERM ^ ;

CREATE OR ALTER PROCEDURE SP$GET_ID_USER
RETURNS (
    RESULT INTEGER)
AS
BEGIN
    RESULT = RDB$GET_CONTEXT('USER_SESSION', 'ID_USER');

    SUSPEND;
END^

CREATE OR ALTER PROCEDURE SP$GET_ID_USER_CONST
RETURNS (
    RESULT INTEGER)
AS
BEGIN
    RESULT = 1;

    SUSPEND;
END^

CREATE OR ALTER FUNCTION CONNECT_ID_USER_DETER
RETURNS INTEGER DETERMINISTIC AS
BEGIN
    RETURN RDB$GET_CONTEXT('USER_SESSION', 'ID_USER');
END^

CREATE OR ALTER FUNCTION CONNECT_ID_USER_CONST_DETER
RETURNS INTEGER DETERMINISTIC AS
BEGIN
    RETURN 1;
END^

CREATE OR ALTER PROCEDURE SP$GET_ID_USER_CONST
RETURNS (
    RESULT INTEGER)
AS
BEGIN
    RESULT = 1;

    SUSPEND;
END^

CREATE OR ALTER FUNCTION CONNECT_ID_USER_NOT_DETER
RETURNS INTEGER AS
BEGIN
    RETURN RDB$GET_CONTEXT('USER_SESSION', 'ID_USER');
END^

CREATE OR ALTER FUNCTION CONNECT_ID_USER_CONST_NOT_DETER
RETURNS INTEGER AS
BEGIN
    RETURN 1;
END^

SET TERM ; ^


Тест:
EXECUTE BLOCK
RETURNS (NAME VARCHAR(60), DIFF_WITH_LOOP INTEGER, DIFF_CLEAR INTEGER)
AS
DECLARE VARIABLE CNT INTEGER;
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIMESTAMP_START TIMESTAMP;
DECLARE VARIABLE TIMESTAMP_END TIMESTAMP;
DECLARE VARIABLE TIME_EMPTY_LOOP INTEGER;
BEGIN
    CNT = 10000000;
    
    --
    I = :CNT;

    TIMESTAMP_START = 'NOW';
    WHILE (I > 0) DO
    BEGIN
        :I = :I - 1;
    END

    TIMESTAMP_END = 'NOW';
    DIFF_WITH_LOOP = DATEDIFF(MILLISECOND, :TIMESTAMP_START, :TIMESTAMP_END);
    DIFF_CLEAR = 0;
    NAME = 'EMPTY LOOP';
    SUSPEND;
    TIME_EMPTY_LOOP = :DIFF_WITH_LOOP;

    --
    I = :CNT;

    TIMESTAMP_START = 'NOW';
    WHILE (I > 0) DO
    BEGIN
        ID = (SELECT RESULT FROM SP$GET_ID_USER);

        :I = :I - 1;
    END

    TIMESTAMP_END = 'NOW';
    DIFF_WITH_LOOP = DATEDIFF(MILLISECOND, :TIMESTAMP_START, :TIMESTAMP_END);
    DIFF_CLEAR = :DIFF_WITH_LOOP - :TIME_EMPTY_LOOP;
    NAME = 'SELECT FROM SP AS RDB$GET_CONTEXT';
    SUSPEND;

    --
    I = :CNT;

    TIMESTAMP_START = 'NOW';
    WHILE (I > 0) DO
    BEGIN
        ID = (SELECT RESULT FROM SP$GET_ID_USER_CONST);

        :I = :I - 1;
    END

    TIMESTAMP_END = 'NOW';
    DIFF_WITH_LOOP = DATEDIFF(MILLISECOND, :TIMESTAMP_START, :TIMESTAMP_END);
    DIFF_CLEAR = :DIFF_WITH_LOOP - :TIME_EMPTY_LOOP;
    NAME = 'SELECT FROM SP AS CONST';
    SUSPEND;

    --
    I = :CNT;

    TIMESTAMP_START = 'NOW';
    WHILE (I > 0) DO
    BEGIN
        ID = CONNECT_ID_USER_NOT_DETER();

        :I = :I - 1;
    END

    TIMESTAMP_END = 'NOW';
    DIFF_WITH_LOOP = DATEDIFF(MILLISECOND, :TIMESTAMP_START, :TIMESTAMP_END);
    DIFF_CLEAR = :DIFF_WITH_LOOP - :TIME_EMPTY_LOOP;
    NAME = 'GET FROM NOT DETERM INTERNAL FUNCTION AS RDB$GET_CONTEXT';
    SUSPEND;

    --
    I = :CNT;

    TIMESTAMP_START = 'NOW';
    WHILE (I > 0) DO
    BEGIN
        ID = CONNECT_ID_USER_CONST_NOT_DETER();

        :I = :I - 1;
    END

    TIMESTAMP_END = 'NOW';
    DIFF_WITH_LOOP = DATEDIFF(MILLISECOND, :TIMESTAMP_START, :TIMESTAMP_END);
    DIFF_CLEAR = :DIFF_WITH_LOOP - :TIME_EMPTY_LOOP;
    NAME = 'GET FROM NOT DETERM INTERNAL FUNCTION AS CONSTANT';
    SUSPEND;

    --
    I = :CNT;

    TIMESTAMP_START = 'NOW';
    WHILE (I > 0) DO
    BEGIN
        ID = CONNECT_ID_USER_DETER();

        :I = :I - 1;
    END

    TIMESTAMP_END = 'NOW';
    DIFF_WITH_LOOP = DATEDIFF(MILLISECOND, :TIMESTAMP_START, :TIMESTAMP_END);
    DIFF_CLEAR = :DIFF_WITH_LOOP - :TIME_EMPTY_LOOP;
    NAME = 'GET FROM DETERM INTERNAL FUNCTION AS RDB$GET_CONTEXT';
    SUSPEND;

    --
    I = :CNT;

    TIMESTAMP_START = 'NOW';
    WHILE (I > 0) DO
    BEGIN
        ID = CONNECT_ID_USER_CONST_DETER();

        :I = :I - 1;
    END

    TIMESTAMP_END = 'NOW';
    DIFF_WITH_LOOP = DATEDIFF(MILLISECOND, :TIMESTAMP_START, :TIMESTAMP_END);
    DIFF_CLEAR = :DIFF_WITH_LOOP - :TIME_EMPTY_LOOP;
    NAME = 'GET FROM DETERM INTERNAL FUNCTION AS CONSTANT';
    SUSPEND;

    --
    I = :CNT;

    TIMESTAMP_START = 'NOW';
    WHILE (I > 0) DO
    BEGIN
        ID = RDB$GET_CONTEXT('USER_SESSION', 'ID_USER');

        :I = :I - 1;
    END

    TIMESTAMP_END = 'NOW';
    DIFF_WITH_LOOP = DATEDIFF(MILLISECOND, :TIMESTAMP_START, :TIMESTAMP_END);
    DIFF_CLEAR = :DIFF_WITH_LOOP - :TIME_EMPTY_LOOP;
    NAME = 'GET FROM RDB$GET_CONTEXT';
    SUSPEND;

    --
    I = :CNT;

    TIMESTAMP_START = 'NOW';
    WHILE (I > 0) DO
    BEGIN
        ID = 1;

        :I = :I - 1;
    END

    TIMESTAMP_END = 'NOW';
    DIFF_WITH_LOOP = DATEDIFF(MILLISECOND, :TIMESTAMP_START, :TIMESTAMP_END);
    DIFF_CLEAR = :DIFF_WITH_LOOP - :TIME_EMPTY_LOOP;
    NAME = 'DIRECT SET';
    SUSPEND;
END


Результаты теста:
NAMEDIFF_WITH_LOOPDIFF_CLEAR
EMPTY LOOP24220
SELECT FROM SP AS RDB$GET_CONTEXT3586033438
SELECT FROM SP AS CONST2979827376
GET FROM NOT DETERM INTERNAL FUNCTION AS RDB$GET_CONTEXT1915716735
GET FROM NOT DETERM INTERNAL FUNCTION AS CONSTANT1426611844
GET FROM DETERM INTERNAL FUNCTION AS RDB$GET_CONTEXT2875453
GET FROM DETERM INTERNAL FUNCTION AS CONSTANT2828406
GET FROM RDB$GET_CONTEXT55783156
DIRECT SET2766344


Из статистики видно, что:
1. Выборка из ХП медленнее выборки из функции примерно в 2 раза.
2. Флаг DETERMINISTIC реально ускоряет присвоение, по скорости почти равняясь прямому присвоению.
3. Получение значения из RDB$GET_CONTEXT примерно в 10 раз медленнее прямого присвоения.
4. Получение значения из RDB$GET_CONTEXT через обертку в виде функции медленнее примерно в 5 раз.
5. Получение значения из RDB$GET_CONTEXT быстрее получения значения из функции примерно в 4 раза.

Internal и external function с одинаковым названием

$
0
0
FB 3.0. В базе есть UDF с именем FORMAT_DATE. И я создал FUNCTION с именем FORMAT_DATE. Теперь я не могу сделать вызов UDF, так как она перекрывается обычной функцией. Надо ли идти с этим в трекер?

Как передать в хранимую процедуру массив (Excel VBA + ADO)

$
0
0
Добрый день.
Вот, пытаюсь в своем проекте переписать код работы с базой, конкретно - запись через хранимые процедуры..
И возник вопрос, а как записывать массивы данных?
Конкретно у меня - автоматизация мебельного производства, запись заказов.
Есть шапка заказа, таблица с составом и таблица с производственными датами по участкам.
До этого я делал всё в цикле..

' Вставляем список дат
            CMD.CommandText = "Select * From ORDERS_DATE_PLAN;"
            .Open Source:=CMD
            ' В цикле записываем в базу таблицу
            For iRow = 1 To UBound(ArrDate)
                If ArrDate(iRow, 2) <> "" Then
                    .AddNew
                        !Order_ID = OrderID
                        !DATE_SECTOR = ArrDate(iRow, 1)
                        !DATE_DESCRIPTION = ArrDate(iRow, 2)
                        !PLAN_DATE = Replace(ArrDate(iRow, 3), ",", ".") ' исправление опечаток
                        !PLAN_DATE2 = Replace(ArrDate(iRow, 4), ",", ".") ' исправление опечаток
                    .Update
                End If
            Next iRow
            .Close


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

Обновление индексной статистики

$
0
0
В старых версиях FB (2.0, 2.1) насколько я знаю, нет автоматического обновления индексной статистики (во всяком случае у меня такое мнение сложилось). Из-за этого очень часто FB принимает неправильные решения по использованию индексов. Приходится очень часто в коде использовать приёмы "ORDER BY ID+0" либо уточнять план запроса после WHERE. Также из-за этого я не использую JOIN. Только LEFT JOIN.
Подскажите, в последних версиях FB (3.x, 4.x) ситуация такая-же или разработчики FB что-нибудь улучшили?

Служба поддержки

$
0
0
Добрый день,

Расширяем нашу службу поддержки.
Если кому-то интересна удаленная работа администратором Firebird, пишите ak@ibase.ru, спишемся-созвонимся-поговорим.
Предпочтение отдаем пожилым зубрам, которые не испортят борозду :), но и для зеленых постараемся найти гибкую программу роста.

With best regards,
Alexey Kovyazin
HQbird www.ib-aid.com
Техподдержка www.ibase.ru

Ошибка пересоздания процедур

$
0
0
Владу тчк

при очередной (! до того было с десяток удачных) попытке пересоздания зависимых процедур

получаю

This operation is not defined for system tables.
unsuccessful metadata update.
STORE RDB$PROCEDURE_PARAMETERS failed.
invalid BLOB ID.


Параметры (набор, типы, порядок не меняются)

Пробовал
- создавать пустые (begin suspend; end)
- переподключаться
- validate
- перезапуск службы
- перезапуск IBExpert и пр.

2.5.7.27050

базу на всякий случай сохранил, могу прислать.

Проблема с компонентом IBBackupService, и GetNextLine method

$
0
0
Доброе время суток,

У меня программа (БД) (написана Delphi7) работает под Firebird, с Windows 10 (x64).
Также на этом ПК также стоит и Delphi10.2 (со своим Client InterBase).

Программа использует компонент «IBBackupService1», который использует «GetNextLine method».
С некоторого времени на этом методе стала возникать ошибка:
«…. exception class EIBInterBaseError with message 'unavailable database unknown ISC error 336330835'

Я вычитал, что это из-за неправильного подхвата программой «gds32.dll». Правда у меня на ПК стоит аж 4 библиотеки «gds32.dll» и разного размера, см. рис.введите сюда описание изображения

Хотя несколько недель назад, я компилировал эту же программу (именно с этим кусочком кода) на этом же ПК, и тогда проблем не было.
Да и я на этом ПК, то инсталлировал, то деинсталлировал FB. (и у меня в system32 стоят «gds32.dll» только от FB).
Еще для Delphi7 ставил обновления "IBXDP705.EXE" и "IBXDP708.EXE" - но это было давно.

На другом ПК (с Windows XP (x32)), на котором стоит только FB и одна «gds32.dll» (и я удалил все лишние «gds32.dll», когда-то там тоже стоял InterBase), таких проблем нет. Мне, что нужно теперь в Delphi10.2, сносить «Client InterBase»?

Запрос с подзапросом и *

$
0
0
Проверял на FB 2.5 и FB 3.0 - поведение одно и то же.

Вот этот запрос не подготавливается:
SELECT
    1,
    *
FROM
    RDB$DATABASE

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 3, column 5.
*.

Чтобы он подготовился, требуется указать имя таблицы/альяса перед *. Перевод подзапроса вторым полем не влияет на итог.
Вопрос: такое поведение корректно или это недопонимание парсера?

Зависание FB при удалении таблицы/поля

$
0
0
Владу Хорсуну.
FB 3.0.4 SS Windows x64.
При работе с метаданными баз при работающих пользователях натолкнулся на следующую проблему. Иногда, при удалении таблицы или поля (в wait-транзакции), при коммите (из IBExpert) происходит зависание. Завершение транзакций в базе не отрабатывает - в MON$TRANSACTIONS висят ожидающие коммита транзакции. При этом иногда при попытке считать данные из MON$ATTACHMENTS так же происходит зависание. Если выборка из MON$ATTACHMENTS не зависла, то при удалении части/всех подключений оттуда - коммит завершается и можно продолжать работать с базой.
При попытке остановить процесс сервера - firebird никак на это не реагирует, помогает только перезагрузка виндовса.
Воспроизвести на тестовой базе такой случай не удалось.

В следующий раз, когда такое произойдет, достаточно ли будет сделать файл дампа процесса (через диспетчер задач виндовса) или надо что-то другое сделать для диагностики?
P.S. Воспроизводимый пример буду стараться сделать в любом случае.

Expected length 10, actual 10.

$
0
0
Знаю, что Delphi тут никто не знает, тем не менее.
Есть ХП:
CREATE OR ALTER PROCEDURE TEST_SP (
    PARAM VARCHAR(10) NOT NULL)
RETURNS (
    RESULT INTEGER)
AS
BEGIN
    RESULT = 1;
    SUSPEND;
END


В IBExpert делаю выборку оттуда, передавая в параметр более 10 символов
SELECT RESULT FROM TEST_SP(:VAL)


Возвращается ошибка:
Incompatible column/host variable data type.
Dynamic SQL Error.
SQL error code = -303.
arithmetic exception, numeric overflow, or string truncation.
string right truncation.
expected length 10, actual 11.

Когда то же самое делаю в TpFIBQuery (FIB+), возвращается вот такая ошибка:
FormMain:
Incompatible column/host variable data type.
SQL error state =22001
Dynamic SQL Error.
SQL error code = -303.
Arithmetic exception, numeric overflow, or string truncation.
String right truncation.
Expected length 10, actual 10.

Проверка показала, что в значение actual почему-то подставляется значение expected.
Можете подсказать, где и куда смотреть, чтобы найти причину? Не могу понять, это баг в FIB+ или где-то еще.

object TABLE is in use.

$
0
0
Создал отдельную тему для 21663641.
В общем, вчера, после перезапуска базы, удалил две неиспользуемые таблицы. Сегодня утром попытался продолжить удаление и снова:
Невозможно подтвердить транзакцию:
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
lock conflict on no wait transaction.
unsuccessful metadata update.
object TABLE "IMP$XXX" is in use.

Таблицы эти без ВК и прочего - просто таблица с данными. К ней никто не обращается. В MON$STATEMENTS никаких ссылок на удаляемые таблицы нет. В IBExpert'не ничего не делал, значит, это точно не он. То есть кто блокирует - загадка.

Влад, ответьте, пожалуйста, на следующие вопросы:
1. После отключения последнего пользователя от базы, все блокировки метаданных просто уничтожаются вместе со снятием блокировки с файла базы?
2. Блокировка связана с коннектом? Я понял, что препарированный запрос живет без транзакции, а если пользователь отключается от базы, не удалив препарированный запрос?
3. Через fb_lock_print можно увидеть, кто держит блокировку таблицы?

И отдельный вопрос:
1. Так как используется счетчик, нет возможности узнать, кто конкретно поставил блокировку?

Явно известно только в каком коннекте она используется.
Чтобы узнать точнее, нужно перебрать все запросы в кеше метаданных данного коннекта.

Есть возможность сделать доработку сообщения, которая покажет, в каких коннектах используется таблица?

FireSwarm доступен для альфа-тестирования

$
0
0

Если вас не пугают непротоптанные пути и полчища багов, способных вылезти из любого места,
то добро пожаловать на открытое альфа-тестирование FireSwarm - системы multimaster
репликации, годящейся для построения HA, а возможно, и LB кластеров.

http://www.ibphoenix.com/ibpr_devel/fireswarm/

Posted via ActualForum NNTP Server 1.5

Замедлился запрос

$
0
0
После вставки подзапроса с inner join
,(select first 1 asnakods.kod1c from tableasna as ta inner join asnakods on (ta.kodasna = asnakods.kodasna) and (ta.kod1c = ostatok_na_date.kod1c)) as asnakod1c
запрос сильно замедлился. Подскажите можно ли как-то избежать этого?

+

readQuery.SQL.Add(
'select (select first 1 name from sprtovara where ID = ostatok_na_date.idtovar) as tovar , '+
'       (select first 1 name from sprproizv where ID = ostatok_na_date.idproizv) as proizv, '+
'       (select first 1 name from sprserii  where ID = ostatok_na_date.idserii) as seriya, '+
'       (select first 1 goden_do from TABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar)) as goden_do,'+
'       (select NUMSERT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as numsert,'+
'       (select DATAEND from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as dataend,'+
'       (select DEKLARANT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as deklarant,'+
'       (select DATAOUT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as dataout,'+
'        ostatok_na_date.ostatok, '+
'        ostatok_na_date.cena, ostatok_na_date.cenaopt, ostatok_na_date.idserii '+
// 13.03.2017
'  ,ostatok_na_date.idtovar, ostatok_na_date.idproizv, ostatok_na_date.prihod, '+
'  (select first 1 tovar from tnelikvid as tn where ((tn.serii = ostatok_na_date.idserii) and (tn.proizv = ostatok_na_date.idproizv)' +
'   and (tn.tovar = ostatok_na_date.idtovar) and (tn.cena = ostatok_na_date.cena))) as nelik, '+
'  (select first 1 not_show from tnelikvid as tn where ((tn.serii = ostatok_na_date.idserii) and (tn.proizv = ostatok_na_date.idproizv)' +
'   and (tn.tovar = ostatok_na_date.idtovar) and (tn.cena = ostatok_na_date.cena))) as not_show' +
    //13.03.2017

    
  //05.09.2018
 {//10.07.2018
 '  ,(select first 1 id_sprtovara from tableasna as ta where (ta.id_sprproizv = ostatok_na_date.idproizv)' +
 '   and (ta.id_sprtovara = ostatok_na_date.idtovar)) as asnatovar, ' +
 '  (select first 1 id_sprproizv from tableasna as ta where (ta.id_sprproizv = ostatok_na_date.idproizv)' +
 '   and (ta.id_sprtovara = ostatok_na_date.idtovar)) as asnaproizv ' +
  //10.07.2018 }

 '  ,(select first 1 asnakods.kod1c from tableasna as ta inner join asnakods on (ta.kodasna = asnakods.kodasna) and (ta.kod1c = ostatok_na_date.kod1c)) as asnakod1c ' +
   //05.09.2018

//15.06.2018
    ' ,ostatok_na_date.Kod1C as Kod1C ' +
    ' ,ostatok_na_date.Barcode as barcode ' +
    ' ,ostatok_na_date.INN as INN ' +
    ' ,ostatok_na_date.Naklad as Naklad ' +
    ' ,ostatok_na_date.hide as hide ' +
 //15.06.2018


' from ostatok_na_date(:d1)');


З.Ы. firebird 2.5 + fibplus а дельфи

Необъяснимое удаление первой строки в одной из таблиц БД

$
0
0
Firebird 2.5, клиент на Delphi. Раз в год происходит необъяснимое удаление самой первой строки в одной их таблиц БД. Таблица основная (хранится одновременно приход и расход), самая большая, но далеко не единственная. Есть сопоставимые по числу записей.
Причем первая строка пропадает на каждой из торговых точек (коих 15 штук), но не одновременно.
Предыстория: раз в год происходит обрезка базы - очищаются все таблицы, кроме справочников, остатки переносятся вручную через файл Excel приходным документом в клиенте. Через некоторое время - разное для каждой точки - месяц, два или более и происходит пропажа первой строки. Потом до следующей обрезки вроде все в порядке - ничего не пропадает.
Можно как-то выяснить в чем дело без ведения логов? Потому что 1) первая строка на рабочих базах уже везде пропала, 2) на точках включение логов нецелесообразно так как и там все работает медленно и 3) поможет ли вообще ведение логов для точного выяснения причины данной ситуации?
Сейчас хотелось хотя бы выяснить:
1. Дело в Firebird и происходит в результате каких-то внутренних процедур - возможно переиндексации или чего то подобного?
2. Дело в клиенте. Если в клиенте то в какую сторону копать?
З.Ы. Документ с этой самой первой строкой (входящие остатки) точно не перепроводился с момента обрезки базы на большинстве точек

Возвращаемый результат функции IIF

$
0
0
FB3. Для примера из руководства:
SELECT IIF(SEX = 'M', 'Sir', 'Madam') FROM CUSTOMERS

функция возвратит 'Sir ' (с двумя пробелами сзади). Претензий в общем-то нет. Но если это баг, то надо бы исправить. А если фича, может в руководстве описать случай. Тем более, что case работает по-другому. Мне пришлось поменять iif на case. А iif компактнее (в моём случае), поэтому предпочтительнее.
Viewing all 1677 articles
Browse latest View live