powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Insert в mdb-файл (MS Access) данных из FireBird средствами IBExpert
13 сообщений из 13, страница 1 из 1
Insert в mdb-файл (MS Access) данных из FireBird средствами IBExpert
    #39107295
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FB 2.5.1
IBExpert 2015.11.17.1
Win XP Pro 32
MS Access любой версии
--------------------------------------

Хочу понять можно-ли в IBEBlock (IBEScript) проходить по таблицам базы FB и вставлять их данные в целевые таблицы MS Access?

Судя по коду, который нашел на ibexpert.net , надежда есть:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
execute ibeblock
returns (CustNo integer, Company varchar(100), Addr1 varchar(100))

    as
    begin
    InCust = 3000;
    OdbcCon = ibec_CreateConnection(__ctODBC, 'DBQ=D:\Delphi5\CMP\mODBC\DB\demo.mdb;DRIVER=Microsoft Access Driver (*.mdb)');
    ibec_UseConnection(OdbcCon);

    execute statement 'select Company from customer where CustNo = 4312' into :MyCust;

    for select CustNo, Company, Addr1 from customer
       where CustNo > :InCust
       order by company
       into :CustNo, :Company, :Addr1
    do
    begin
       suspend;
    end
    ibec_CloseConnection(OdbcCon);
 end



Так как опыта написания блоков у меня нет, то подобные задачи раньше я решал через создание клиента в Delphi, который перекидывал данные из одной базы в другую. Через IDE конечно решение можно сделать гибким и с кучей примочек и кнопок.
Но в данном случае, если это конечно возможно, я бы хотел попробовать решить эту задачу средствами IBExpert, так как перед выгрузкой данных на стороне FB нужно запустить много запросов для кэширования итоговых таблиц.

Вдруг кто решал уже успешно подобную задачу и есть пример успешно работающего кода IBEBlock?

Буду признателен за пример, а то велосипед изобретать не очень хочется. )
...
Рейтинг: 0 / 0
Insert в mdb-файл (MS Access) данных из FireBird средствами IBExpert
    #39107327
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все. Сам разобрался.

Вот пример:
Код: sql
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.
execute ibeblock
 as
 begin

   FBSrc  = ibec_CreateConnection(__ctFirebird,'DBName="localhost:C:\DB1.FDB";
   ClientLib=C:\Program Files\Firebird\Bin\fbclient.dll;
   user=SYSDBA; password=masterkey; names=WIN1251; sqldialect=3');

   FBDest = ibec_CreateConnection(__ctODBC,'DBQ=C:\bsk.empty.test.mdb;DRIVER=Microsoft Access Driver (*.mdb)');

   ibec_UseConnection(FbSrc);

   for select CustNo, Company, Addr1 from customer order by company into :CustNo, :Company,
     :Addr1
   do
   begin
      use FBDest;
      INSERT INTO CUSTOMER (CustNo, Company, Addr1) VALUES (:CustNo, :Company, :Addr1);
      use FBSrc;
   end
   use FBDest;
   COMMIT;
   ibec_CloseConnection(FBSrc);
   ibec_CloseConnection(FBDest);
 end



Правда появились новые вопросы!

1. Как запускать IBEBlock с кириллическими именами полей таблиц Access?
Если из окна отладчика (в режиме отладки) - все хорошо.
Если из списка блоков по F9 - ругается на абракадабру в которую превращаются имена после принудительного преобразования в UTF-8:


2. Как в поля Access типа Date запихивать значение null?
Я временно(надеюсь что существует более прямое решение) эту задачу решил так:
сохраняю данные из FB в строковой переменной, проверяя в читающем запросе дату на FireBird'овское значение null:
Код: sql
1.
2.
3.
4.
5.
6.
7.
TextDate Varchar(20);
...
Select
    IIF( DateField is null, 'NULL', date_to_str( DateField, '%d.%m.%y' )
FROM TABLE_FB
INTO 
   :TextDate;


а в пишущем запросе проверяю уже строку и вставляю либо Access'овский вариант NULL, либо отформатированную под дату строку:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
INSERT INTO TABLE_ACCESS
  (
      DateField
  )
VALUES
  (
      IIF( :TextDate = 'NULL', NULL, :TextDate ) 
  )
...
Рейтинг: 0 / 0
Insert в mdb-файл (MS Access) данных из FireBird средствами IBExpert
    #39107330
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nofate2009,

1. Похоже на баг.
2. Тебе лучше знать, как засовывать NULL в Access.

Присылай тестовые базы, fb и access, тогда смогу проверить и, возможно, поправить.
...
Рейтинг: 0 / 0
Insert в mdb-файл (MS Access) данных из FireBird средствами IBExpert
    #39107333
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С кодировкой кириллических имен вроде бы победилось.
Пошаманил копипастом из Notepad++ с преобразованием текста в нем.
И заметил, что при копировании текста с включенной русской раскладкой клавиатуры и последующей его вставкой в целевой редактор, кириллические имена сохраняются корректно. Или наоборот...
В общем ничего нового - просто хореография с бубном )
...
Рейтинг: 0 / 0
Insert в mdb-файл (MS Access) данных из FireBird средствами IBExpert
    #39107342
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,

Вот простой пример:
Код: sql
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.
execute ibeblock
returns (
            FieldDate  Date
        )

    as
    begin

        AccessDest = ibec_CreateConnection(__ctODBC,     'DBQ=C:\test.mdb;DRIVER=Microsoft Access Driver (*.mdb)');

        FieldDate = null;
        ibec_UseConnection(AccessDest);

        INSERT INTO T_TEST
                  (
                   AccessDateField
                   )
               Values
                  (
                   :FieldDate
                  );

       COMMIT;

       ibec_CloseConnection(AccessDest);

 end



Вот тестовая база Access к этому примеру.

У меня итог работы блока выглядит так:


Модератор: Тема перенесена из форума "Firebird, InterBase".
...
Рейтинг: 0 / 0
Insert в mdb-файл (MS Access) данных из FireBird средствами IBExpert
    #39107390
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nofate2009,

С null'ами вроде разобрался. Проверь в свежем билде.
...
Рейтинг: 0 / 0
Insert в mdb-файл (MS Access) данных из FireBird средствами IBExpert
    #39107504
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,
да вы просто волшебник!!!

Все работает теперь без костылей )))
---------------------------------------------

Может быть тогда получится и с кодировкой в блоках разобраться?

Вот код тестового блока:
Код: sql
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.
execute ibeblock
returns (
            FieldText  Varchar(255)
        )

    as
    begin

        AccessDest = ibec_CreateConnection(__ctODBC,     'DBQ=C:\test.mdb;DRIVER=Microsoft Access Driver (*.mdb)');

        FieldText  = 'любой текст';
        ibec_UseConnection(AccessDest);

        INSERT INTO "Тестовая таблица"
                  (
                   "Текстовое значение"
                   )
               Values
                  (
                   :FieldText
                  );
         Suspend;
       COMMIT;

       ibec_CloseConnection(AccessDest);

 end



Вот тестовая база Access для него.

Если запускать блок из контекстного меню блоков любой FB-Базы (Вкладка IBExpert "Базы"), то все замечательно:


Но, если создать блок ровно с таким же кодом на вкладке IBExpert "Блоки", то при запуске его из контекстного меню (или по F9), вижу следующую картинку:
...
Рейтинг: 0 / 0
Insert в mdb-файл (MS Access) данных из FireBird средствами IBExpert
    #39107564
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,
поторопился я вас хвалить )


С null вроде бы решилось. Но завалилось все остальное!
IBEBlock теперь вместо строковых и целочисленных значений забивает поля базы Access нулями!

Это видно даже на последнем тестовом примере с кириллическими именами объектов базы Access.

Вот итог "успешной" работы блока:


- Везде "0", вместо "любой текст".

Думаю такой билд нужно срочно откатить!
...
Рейтинг: 0 / 0
Insert в mdb-файл (MS Access) данных из FireBird средствами IBExpert
    #39107601
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nofate2009Думаю такой билд нужно срочно откатить!

Да прям, эти фичи полтора пользователя используют.
Пойду погуляю, потом разберусь.
...
Рейтинг: 0 / 0
Insert в mdb-файл (MS Access) данных из FireBird средствами IBExpert
    #39107604
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nofate2009- Везде "0", вместо "любой текст".

Вообще, там только обработка пустых значений изменилась, все остальное осталось как прежде.
Предыдущая версия разве как-то иначе тот же блок отрабатывает, если значение не пустое?
...
Рейтинг: 0 / 0
Insert в mdb-файл (MS Access) данных из FireBird средствами IBExpert
    #39107656
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,
да, до этого я полностью написал блок, который заливал селект из FB в Access. Почти 30 полей и 3000 записей.
Раз 20 успешно его прокатал.

После обновы блок стал падать на первой-же записи при попытках забить поля нулями.
Сейчас доеду до дома и попробую на другом компе запустить этот блок.
Вдруг дело в клиентской машине.
...
Рейтинг: 0 / 0
Insert в mdb-файл (MS Access) данных из FireBird средствами IBExpert
    #39107743
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой косяк был. Исправил.
...
Рейтинг: 0 / 0
Insert в mdb-файл (MS Access) данных из FireBird средствами IBExpert
    #39108002
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,
все замечательно!

Огромное спасибо!
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Insert в mdb-файл (MS Access) данных из FireBird средствами IBExpert
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]