GET(File, key) не находит запись

56 views
Skip to first unread message

Alexander Strumensky

unread,
Oct 13, 2016, 12:09:03 PM10/13/16
to cla...@googlegroups.com
Доброго времени суток

Вот уже который час бьюсь головой об стену и не могу побороть

Clarion 10.0.12327

Есть файл:

ClientAcct             FILE,DRIVER('TOPSPEED'),RECLAIM,NAME('Clients.tps\!Accounts'),PRE(cla),CREATE,BINDABLE
by_id                    KEY(cla:id_acc),PRIMARY
by_account               KEY(cla:account,cla:currcode)
by_box                   KEY(cla:id_cli,cla:account,cla:currcode)
Record                   RECORD,PRE()
id_cli                     LONG
id_acc                     LONG
currcode                   LONG
account                    STRING(20)
name                       STRING(100)
                         END
                       END

Есть некая обработка входящих данных:

DocTpl.GetAccount    PROCEDURE(*STRING acc, UNSIGNED curr, LONG date)
    CODE
  cla:account  = acc
  cla:currcode = curr
  GET(ClientAcct, cla:by_account)
  CASE ERRORCODE()
  OF NoError

    ...

    RETURN True
  OF NoRecErr
    SELF.NotifyError(320)
  ELSE
    SELF.NotifyError(321)
  END
  RETURN False

при

  acc=26002000033001
  curr=980

попадает в NoRecErr, хотя такая запись в файле существует

чтобы не было подозрений на непечатный символ вывел значения в шестнадцатеричной форме:

acc=hex:3236303032303030303333303031202020202020
curr=980

в базе cla:account=hex:3236303032303030303333303031202020202020
       cla:currcode=980

Пока что сделал конструкцию:

  CLEAR(cla:record)
  cla:account  = acc
  cla:currcode = curr
  SET(cla:by_account, cla:by_account)
  NEXT(ClientAcct)
  IF ERRORCODE() OR cla:account <> acc OR cla:currcode <> curr
    SELF.NotifyError(321)
  ELSE
    SELF.AddAccount(date)
    RETURN True
  END
  RETURN False

которая работает, но я считаю это не кузяво и хотелось бы разобраться в чем таки грабельки



--
Best regards,
  Strumensky Alexander

Alexander Strumensky

unread,
Oct 13, 2016, 12:25:55 PM10/13/16
to cla...@googlegroups.com

13 октября 2016 г., 19:08 пользователь Alexander Strumensky <olds...@gmail.com> написал:
Clarion 10.0.12327

Clarion 10.0.11897 то же самое (базы пересоздал)
осталось на C6 попробовать :)

Pavel K

unread,
Oct 13, 2016, 12:49:44 PM10/13/16
to clalist
Такая фигня бывает если ключи строились при одном env-файле, а при поиске другой файл.
Попробуй перестроить ключи, а потом сделать GET при одном и том же env-файле


13 октября 2016 г., 19:25 пользователь Alexander Strumensky <olds...@gmail.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+unsubscribe@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Alexander Strumensky

unread,
Oct 13, 2016, 1:25:52 PM10/13/16
to cla...@googlegroups.com

13 октября 2016 г., 19:49 пользователь Pavel K <pnk...@gmail.com> написал:

Такая фигня бывает если ключи строились при одном env-файле, а при поиске другой файл.
Попробуй перестроить ключи, а потом сделать GET при одном и том же env-файле

спасибо, но не тот случай. базу пересоздал с нуля, для теста добавил 3 записи, эффект тот же.

Alexander Strumensky

unread,
Oct 13, 2016, 1:44:21 PM10/13/16
to cla...@googlegroups.com
сделал ключ

by_account               KEY(cla:account),NOCASE,OPT

та же фигня, хотя рядом файлик с ключом

by_name                  KEY(usr:name),NOCASE,OPT

работает на ура, отличие только в длине строки - там STRING(40)


13 октября 2016 г., 19:25 пользователь Alexander Strumensky <olds...@gmail.com> написал:

Oleg Fomin

unread,
Oct 13, 2016, 5:28:20 PM10/13/16
to cla...@googlegroups.com

Александр,

 

Попытался воспроизвести грабельки – не получается, все работает как надо. Попробовал и на С6.3, и на С10. Что я делаю не так?

 

С уважением, Олег.

--

Вы получили это сообщение, поскольку подписаны на группу "ClaList".

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.

Strum.zip

Alexander Strumensky

unread,
Oct 13, 2016, 9:43:57 PM10/13/16
to cla...@googlegroups.com

14 октября 2016 г., 0:27 пользователь Oleg Fomin <ol...@fomin.info> написал:

Александр,

 

Попытался воспроизвести грабельки – не получается, все работает как надо. Попробовал и на С6.3, и на С10. Что я делаю не так?

 

С уважением, Олег.


ну я даже не постесняюсь TPS прикрепить (нужно было сразу сделать)
и в транзакции попробовать еще
Clients.tps

Ерофеев Анатолий

unread,
Oct 13, 2016, 10:08:50 PM10/13/16
to Alexander Strumensky
Здравствуйте Alexander,
Может быть нужно так:
  cla:account  = clip(acc)
  cla:currcode = curr
  GET(ClientAcct, cla:by_account)
  CASE ERRORCODE()

Thursday, October 13, 2016, 11:08:59 PM, Вы писали:

AS> Доброго времени суток


AS> Вот уже который час бьюсь головой об стену и не могу побороть


AS> Clarion 10.0.12327


AS> Есть файл:


AS> ClientAcct            
AS> FILE,DRIVER('TOPSPEED'),RECLAIM,NAME('Clients.tps\!Accounts'),PRE(cla),CREATE,BINDABLE
AS> by_id                    KEY(cla:id_acc),PRIMARY
AS> by_account               KEY(cla:account,cla:currcode)
AS> by_box                   KEY(cla:id_cli,cla:account,cla:currcode)
AS> Record                   RECORD,PRE()
AS> id_cli                     LONG
AS> id_acc                     LONG
AS> currcode                   LONG
AS> account                    STRING(20)
AS> name                       STRING(100)
AS>                          END
AS>                        END


AS> Есть некая обработка входящих данных:


AS> DocTpl.GetAccount    PROCEDURE(*STRING acc, UNSIGNED curr, LONG date)
AS>     CODE
AS>   cla:account  = acc
AS>   cla:currcode = curr
AS>   GET(ClientAcct, cla:by_account)
AS>   CASE ERRORCODE()
AS>   OF NoError


AS>     ...


AS>     RETURN True
AS>   OF NoRecErr
AS>     SELF.NotifyError(320)
AS>   ELSE
AS>     SELF.NotifyError(321)
AS>   END
AS>   RETURN False


AS> при


AS>   acc=26002000033001
AS>   curr=980


AS> попадает в NoRecErr, хотя такая запись в файле существует


AS> чтобы не было подозрений на непечатный символ вывел значения в шестнадцатеричной форме:


AS> acc=hex:3236303032303030303333303031202020202020
AS> curr=980


AS> в базе cla:account=hex:3236303032303030303333303031202020202020
AS>        cla:currcode=980


AS> Пока что сделал конструкцию:


AS>   CLEAR(cla:record)
AS>   cla:account  = acc
AS>   cla:currcode = curr
AS>   SET(cla:by_account, cla:by_account)
AS>   NEXT(ClientAcct)
AS>   IF ERRORCODE() OR cla:account <> acc OR cla:currcode <> curr
AS>     SELF.NotifyError(321)
AS>   ELSE
AS>     SELF.AddAccount(date)
AS>     RETURN True
AS>   END
AS>   RETURN False


AS> которая работает, но я считаю это не кузяво и хотелось бы разобраться в чем таки грабельки








--
Всего доброго,
Ерофеев
Моб.8-913-812-65-30 ICQ 277579376 Skype erf712
http://www.linksoft.ru mailto:e...@linksoft.ru

Oleg Fomin

unread,
Oct 13, 2016, 10:56:21 PM10/13/16
to cla...@googlegroups.com

Да, что-то не так с твоим TPS. Если подложить его под ноги моей программке (без CREATE и добавления тестовых данных), то на грабельки сразу наступаем. Даже в транзакцию заворачивать код не нужно.

--

Vitaly B.

unread,
Oct 14, 2016, 5:06:46 AM10/14/16
to Alexander Strumensky
Привет, Alexander.

Вы писали 14 октября 2016 г., 2:08:59:
get то вроде по строгому соответствию ищет. А там и ключ неуникален
и поле string

--
Всего наилучшего,
poruchik mailto:fighti...@mail.ru
-------------------------------------------------------------------
В молодости шалил - думал, потом поумнел и стал соображать... ©

Чаплыгин В. Г.

unread,
Oct 14, 2016, 5:33:53 AM10/14/16
to cla...@googlegroups.com
Уникальность ключа не критерий - если есть совпадение всех полей ключа
все равно найдет одну из записей.


14.10.2016 12:06, 'Vitaly B.' via ClaList пишет:
С уважением Чаплыгин Вадим Геннадьевич
мой адрес chapli...@yandex.ru
мой сайт в интернете chapligin.hut4.ru

Oleg Fomin

unread,
Oct 14, 2016, 8:51:20 AM10/14/16
to cla...@googlegroups.com

Алксандр,

 

Открыл проблемный файл утилитой TOPSCAN.EXE, выполнил команду «Rebuild All Keys» - грабли как рукой сняло.

 

Всех с праздником!

 

С уважением, Олег.

Alexander Strumensky

unread,
Oct 17, 2016, 5:15:35 AM10/17/16
to cla...@googlegroups.com

14 октября 2016 г., 12:06 пользователь 'Vitaly B.' via ClaList <cla...@googlegroups.com> написал:

get  то вроде по строгому соответствию ищет. А там и ключ неуникален
  и поле string

там все ключи уникальны

Alexander Strumensky

unread,
Oct 17, 2016, 5:17:26 AM10/17/16
to cla...@googlegroups.com

14 октября 2016 г., 5:08 пользователь Ерофеев Анатолий <e...@linksoft.ru> написал:

Здравствуйте Alexander,
Может быть нужно так:
  cla:account  = clip(acc)
  cla:currcode = curr
  GET(ClientAcct, cla:by_account)

обе переменные - STRING, смысла клиповать нет вообще, т.к. все равно отброшенные пробелы в конце допишутся заново

Alexander Strumensky

unread,
Oct 17, 2016, 5:21:07 AM10/17/16
to cla...@googlegroups.com

14 октября 2016 г., 15:50 пользователь Oleg Fomin <ol...@fomin.info> написал:

Алксандр,

 

Открыл проблемный файл утилитой TOPSCAN.EXE, выполнил команду «Rebuild All Keys» - грабли как рукой сняло.

 

Всех с праздником!

 

С уважением, Олег.


спасибо.

не понятно, почему ключ кривой получается...
буду рыть в этом направлении.

Alexander Strumensky

unread,
Oct 17, 2016, 5:52:04 AM10/17/16
to cla...@googlegroups.com
В общем, такая проблема появлялась при использовании EMPTY(), хотя возможно, что-то глюкнуло на каком-то этапе и файл подпортился, а потом таким и оставался.

Когда делаю CREATE(), все работает.

17 октября 2016 г., 12:21 пользователь Alexander Strumensky <olds...@gmail.com> написал:

Oleg Fomin

unread,
Oct 17, 2016, 6:08:21 AM10/17/16
to cla...@googlegroups.com

Александр,

 

Если это не разовый сбой-повреждение TPS, то в первую очередь стоит обратить внимание на оператор(ы) LOCALE в своей программе (либо ENV файл).

 

С уважением, Олег.

 

From: cla...@googlegroups.com [mailto:cla...@googlegroups.com] On Behalf Of Alexander Strumensky


Sent: Monday, October 17, 2016 12:21 PM
To: cla...@googlegroups.com

--

Nikolay Tsigouro

unread,
Oct 18, 2016, 5:24:24 PM10/18/16
to ClaList
А BUILD не лечит? Может стоит предусмотреть в случае, если запись не находится, раз такая грабля?

WBR, Nikolay Tsigouro

17 октября 2016 г., 12:52 пользователь Alexander Strumensky <olds...@gmail.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+unsubscribe@googlegroups.com.

Alexander Strumensky

unread,
Oct 18, 2016, 6:05:43 PM10/18/16
to cla...@googlegroups.com

19 октября 2016 г., 0:24 пользователь Nikolay Tsigouro <n.tsi...@gmail.com> написал:

А BUILD не лечит? Может стоит предусмотреть в случае, если запись не находится, раз такая грабля?

Пути обхода и так есть, пути лечения тоже.

Меня интересуют причины возникновения.

Юрий Философов

unread,
Oct 19, 2016, 3:11:21 AM10/19/16
to cla...@googlegroups.com
Добрый день! 

Несколько раз наступал на грабли со сгенерированной через Словарь программой конвертации, в которой нет оператора Locale 
Надо после генерации конвертора в начало программы convert.clw  добавить, например, строку Locale('Windows')

С уважением,
Юрий Философов 

19 октября 2016 г., 1:05 пользователь Alexander Strumensky <olds...@gmail.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+unsubscribe@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
С уважением,
Юрий Философов

Alexander Strumensky

unread,
Oct 20, 2016, 10:38:12 AM10/20/16
to cla...@googlegroups.com
Доброго.

В данном случае не в локали дело - тут с большой вероятностью подозреваю EMPTY перед наполнением таблицы

19 октября 2016 г., 10:11 пользователь Юрий Философов <padre...@gmail.com> написал:

Добрый день! 

Несколько раз наступал на грабли со сгенерированной через Словарь программой конвертации, в которой нет оператора Locale 
Надо после генерации конвертора в начало программы convert.clw  добавить, например, строку Locale('Windows')

С уважением,
Юрий Философов 

Матсья Вишну

unread,
Nov 20, 2016, 6:04:07 PM11/20/16
to ClaList
Ну и где грабли жили?

пятница, 21 октября 2016 г., 0:38:12 UTC+10 пользователь Alexander Strumensky написал:

Nikolay Tsigouro

unread,
Nov 20, 2016, 6:59:19 PM11/20/16
to ClaList
Кривой ключ был.

WBR, Nikolay Tsigouro

21 ноября 2016 г., 2:04 пользователь Матсья Вишну <mats...@gmail.com> написал:

--

Alexander Strumensky

unread,
Nov 21, 2016, 8:07:50 AM11/21/16
to cla...@googlegroups.com
Таки в конце концов в одной из прог обнаружилось отсутствие LOCALE('Windows') и совершенно случайно ей же и был создан этот злополучный файл. Потому то и повторить не получалось. Странно только, что в ключевых полях ничего кроме цифр и пробелов не было (т.е. знаков которые зависят от локали не было), но сортировка все равно кривая получалась.

21 ноября 2016 г., 1:04 пользователь Матсья Вишну <mats...@gmail.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+unsubscribe@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Матсья Вишну

unread,
Nov 23, 2016, 7:13:58 AM11/23/16
to ClaList


понедельник, 21 ноября 2016 г., 23:07:50 UTC+10 пользователь Alexander Strumensky написал:
Таки в конце концов в одной из прог обнаружилось отсутствие LOCALE('Windows') и совершенно случайно ей же и был создан этот злополучный файл. Потому то и повторить не получалось. Странно только, что в ключевых полях ничего кроме цифр и пробелов не было (т.е. знаков которые зависят от локали не было), но сортировка все равно кривая получалась.


Так это же известный прикол: таблица сортировки прописывается при создании файла. Лечится перестроением ключей под нужной локалью. По-моему, так повелось ещё с ДОСовских времён.

Alexander Strumensky

unread,
Nov 24, 2016, 2:37:15 PM11/24/16
to cla...@googlegroups.com

23 ноября 2016 г., 14:13 пользователь Матсья Вишну <mats...@gmail.com> написал:

Так это же известный прикол: таблица сортировки прописывается при создании файла. Лечится перестроением ключей под нужной локалью. По-моему, так повелось ещё с ДОСовских времён.

В том то и дело, что везде проставил, а в одной (которая, впрочем, и не используется) пропустил и не заметил.

anatoli cusnir

unread,
Nov 28, 2016, 2:31:13 AM11/28/16
to cla...@googlegroups.com
CW 6.3  .9059. Для вывода на диск используется драйвер MSDOS Окружение - Server 2003 под VMware, ОП - 32Гб (софтина отъедает до 2-х).  Выхода файлов за 4Гб нет.
 
Причем один раз может обработать 250000 исходных объектов (число под красным текстом на скрине), другой раз - только 150000.
 
С чем может быть связано.
 
ERROR1.PNG

Andrey Kuznetsov

unread,
Nov 28, 2016, 10:27:44 AM11/28/16
to cla...@googlegroups.com

Корзину почистить?

--

Вы получили это сообщение, поскольку подписаны на группу "ClaList".

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.

anatoli cusnir

unread,
Nov 29, 2016, 1:22:47 AM11/29/16
to cla...@googlegroups.com
Тоже вариант). Но там картинка со свободным пространством на дисках не зря поверх наложена.
 

 

Oleg Fomin

unread,
Nov 29, 2016, 6:32:42 AM11/29/16
to cla...@googlegroups.com
> CW 6.3 .9059. Для вывода на диск используется драйвер MSDOS Окружение - Server 2003 под VMware, ОП - 32Гб (софтина отъедает до 2-х). Выхода файлов за 4Гб нет.

Из любопытства можно конечно попробовать сменить окружение и запустить этот процесс в другой среде, можно потасовать строки кода, потанцевать с бубном. Но лучше ИМХО сразу сменить «драйвер MSDOS» на нормальные апишные функции записи в файл.

OpenFile https://msdn.microsoft.com/en-us/library/windows/desktop/aa365430(v=vs.85).aspx
WriteFile https://msdn.microsoft.com/en-us/library/windows/desktop/aa365747(v=vs.85).aspx
CloseHandle https://msdn.microsoft.com/en-us/library/windows/desktop/ms724211(v=vs.85).aspx

Вложен пример.

С уважением, Олег.
WriteFile.clw

anatoli cusnir

unread,
Nov 29, 2016, 6:49:04 AM11/29/16
to cla...@googlegroups.com
Спасибо. Если бы 2-й раз делал, изначально так бы и сделал. Задача одноразовая (миграция данных их старой билинговой системы в новую. Через CSV файлы). Тут, похоже, дело в VM, а точнее, в дисковых массивах, используемых VM. Когда я прогнал задачу с выводом на C: (на той же картинке (до этого использовал D:)), все прошло нормально (а это 32-34 часа вывода). А под C: и D: используется пространство на разных массивах. Пока такая версия как рабочая. 
 

 
--
Вы получили это сообщение, поскольку подписаны на группу ClaList.

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/d/optout.
 

Александр Рыбников

unread,
Nov 29, 2016, 1:41:26 PM11/29/16
to anatoli cusnir
Hello anatoli,


Tuesday, November 29, 2016, 1:48:45 PM, you wrote:

Спасибо. Если бы 2-й раз делал, изначально так бы и сделал. Задача одноразовая (миграция данных их старой билинговой системы в новую. Через CSV файлы). Тут, похоже, дело в VM, а точнее, в дисковых массивах, используемых VM. Когда я прогнал задачу с выводом на C: (на той же картинке (до этого использовал D:)), все прошло нормально (а это 32-34 часа вывода). А под C: и D: используется пространство на разных массивах. Пока такая версия как рабочая. 
 
Почистить ВСЕ temp файлы, не путать с корзиной :) Поиграться с ОП и свап(SWAP), с ним (фиксирований) или вообще без него. 

-- 
Best regards,
 Александр                            mailto:gop...@mail.ru

Nikolay Tsigouro

unread,
Nov 30, 2016, 8:10:35 PM11/30/16
to ClaList
Больше суток? Я бы задумался о том, чтобы предварительно скопировать базу на RAM-диск, или, хотя бы на SSD. Ну, и результат кидать туда же.

ЗЫ. А база что, tps? 

WBR, Nikolay Tsigouro

29 ноября 2016 г., 21:39 пользователь 'Александр Рыбников' via ClaList <cla...@googlegroups.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+unsubscribe@googlegroups.com.

Vitaly B.

unread,
Nov 30, 2016, 11:01:58 PM11/30/16
to anatoli cusnir
Привет, anatoli.

Вы писали 29 ноября 2016 г., 21:48:45:

> Спасибо. Если бы 2-й раз делал, изначально так бы и сделал. Задача
> одноразовая (миграция данных их старой билинговой системы в новую.
> Через CSV файлы). Тут, похоже, дело в VM, а точнее, в дисковых
> массивах, используемых VM. Когда я прогнал задачу с выводом на C:
> (на той же картинке (до этого использовал D:)), все прошло
> нормально (а это 32-34 часа вывода). А под C: и D: используется
> пространство на разных массивах. Пока такая версия как рабочая.
>
Так вот ты какой центральный ГИС ЖКХ ;)

--
Всего наилучшего,
poruchik mailto:fighti...@mail.ru
-------------------------------------------------------------------
Советские боевые слоны - самые боевые слоны в мире!

anatoli cusnir

unread,
Dec 1, 2016, 5:43:58 AM12/1/16
to cla...@googlegroups.com

 Слишком большая. Да и задача - разовая. Собственно, не очень напрягает. В отладочных целях есть возможность начать с любого места. А так, на выходные обычно счет идет.
Исходная база MS SQL 2000.
 
С уважением,
Анатолий.

 
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.

anatoli cusnir

unread,
Dec 1, 2016, 5:48:47 AM12/1/16
to 'Vitaly B.' via ClaList
Добрый день.
Нет, это ИС поставки потребителям (расчетов за) природный газ. Молдавия.
Была система "местного изготовления". Все, отмучалась. Переходим на оракловскую СС&В (Client Care & Biling).
 
C уважением,
Анатолий.

 

 

Nikolay Tsigouro

unread,
Dec 1, 2016, 6:34:34 PM12/1/16
to ClaList

А тогда зачем там Clarion? Все с полпинка делается на T-SQL.


1 дек. 2016 г. 13:43 пользователь "anatoli cusnir" <anatoli...@moldovagaz.md> написал:

anatoli cusnir

unread,
Dec 2, 2016, 12:50:29 AM12/2/16
to cla...@googlegroups.com

 Это миграция данных из старой билинговой системы (поставки природного газа) в новую. Абсолютно разные модели объектов в этих двух системах (и по составу объектов и по их свойствам). Данные из старой системы перегоняются в CSV уже в новой модели. Очень много чего приходится собирать из старых данных и перекомпоновывать к виду, пригодному для новой модели. Вплоть до построения объектов новой системы с нуля. Требования к интерфейсным файлам - от Oracle. Поэтому только скулем - никак.
 
С уважением,
Анатолий.

 
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.

Alexander Strumensky

unread,
Dec 2, 2016, 1:42:54 AM12/2/16
to cla...@googlegroups.com

2 декабря 2016 г., 7:50 пользователь anatoli cusnir <anatoli...@moldovagaz.md> написал:

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

с 1998 года занимался разработкой и сопровождением примерно того же в Донбасстрансгазе и его 6 территориально удаленных подразделений.
Битрив, самопальная офлайн репликация, данные которой возились и передавались на чем только можно было - от дискет до модема в лучшем случае на 4800. В последние годы почти в онлайне проходила при современных каналах связи.

Теперь всё, закончилась.

Nikolay Tsigouro

unread,
Dec 2, 2016, 3:45:01 AM12/2/16
to ClaList

А чего в T-SQL не хватает?


2 дек. 2016 г. 8:50 пользователь "anatoli cusnir" <anatoli...@moldovagaz.md> написал:

anatoli cusnir

unread,
Dec 2, 2016, 4:07:51 AM12/2/16
to cla...@googlegroups.com

 Может я не правильно выразился. Я имел ввиду, что только SQL запросов не хватает . А T-SQL как язык процедур (программирования)? Не могу сказать. Не знаю я его. Времени на выбор средств особо не было. Да и реализация для версии
2000, как-то... сомнительно. Кроме того, в плюс CW могу сказать, что аппарат очередей очень выручает. Некоторые таблицы базы и курсоры просто засажены в очереди. в начале работы (на что уходит минут 10-15). Без этого (с запросом и вычиткой данных  из базы на каждом повторении цикла) софтина вообще до 3-х суток работала. Не думаю, что T-SQL такое позволит. Но, опять же, я его не знаю.
 
С уважением,
Анатолий. 

 
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.

Nikolay Tsigouro

unread,
Dec 2, 2016, 5:38:17 AM12/2/16
to ClaList
T-SQL (впрочем, как и PL-SQL) это язык программирования сервера БД. В нем есть почти все - IF-ы, переключатели, циклы, процедуры, декларации переменных и таблиц... Синтаксис, правда, своеобразный. Особенно итерации курсора. Требует привыкания. Можно подключить всякие OLE компоненты. В частности через них осуществляется ввод-вывод текстовых файлов. Вот тут подробно расписано что и как: http://devwithdave.com/SQLServer/stored-procedures/SQLServer-StoredProcedures--HOW-TO-WRITE-TO-A-TEXT-FILE.asp
Нет только деклараций _своих_ объектов. Язык процедурный, не ООП. Чем-то похож на Basiс (что совсем не странно - Microsoft, однако ;-)). В последних версиях хранимки можно программить на с#. Там вообще все есть. Клаша (и прежде всего ее объектная модель) просто отдыхает.

Ежели чего вдруг в SQL-2000 не хватает, всегда можно перегнать базу в более поздние версии: Backup2000 - Restore2005-08-12-16. Но думаю, что для твоей задачи ничего существенного там не появилось. Ну, разве что c#, но ты вряд-ли туда пойдешь.;-)

--  Кроме того, в плюс CW могу сказать, что аппарат очередей очень выручает.

Никакой это не плюс. Это костыль, потому как каждый раз лазить в базу с клиента накладно. А для транзакта это все родное. Оно все тут. И SELECT в транзакте будет работать никак не хуже, чем поиск в QUEUE. В выигрыше получишь, как минимум, перекачку на клиента. Но не только. Вместо итерации циклом по выборке для заполнения временных таблиц (читай очередей) будешь работать сразу со всей выборкой и писать, например, так (https://msdn.microsoft.com/ru-ru/library/ms174335.aspx):
INSERT INTO dbo.MyQueueTable 
    SELECT <поля-источники> 
    FROM MainOldTable
        JOIN... 

PS. Тут подумалось, что чтобы не заморачиваться с выводом в файл из транзакта, можно результаты положить в табличку:
CREATE TABLE OutData 
( ID int INENTITY NOT NULL PRIMARY KEY
, FILE_NAME varchar(256) NOT NULL 
, LINE_NUM int NOT NULL
, LINE_TEXT text
)
А потом в клаше выгрести их и записать в csv. Если в csv порядок записей не важен, то с LINE_NUM можно не заморачиваться. А можно и без клаши. Насколько я помню, в нативном клиенте MS SQL есть возможность экспорта таблиц в csv с фильтрацией данных. И в 

PPS. Я тут недавно сравнивал на Андройдовской SQLite производительность SELECT... FROM...WHERE и цикла с фильтром на java (аналогично построению выборки по QUEUE).
Задача - выбрать отобранные записи и подсчитать их количество. SELECT в 4 раза быстрее. И ни в одном тесте не проиграл! В целом, получилось, что чем более навороченный функционалом SELECT, тем больше выигрыш!!! Минимальное преимущество (> 2 раз) было на тесте с группировкой и подсчетом количества записей в группе. В тесте агрегатных функций, преимущество более 10 раз.
Обрати внимание, что тут нет ни диска, ни сетки - все в памяти. Получается вчистую сравнение технологий.


WBR, Nikolay Tsigouro

2 декабря 2016 г., 12:07 пользователь anatoli cusnir <anatoli...@moldovagaz.md> написал:

Юрий Философов

unread,
Dec 2, 2016, 6:14:35 AM12/2/16
to cla...@googlegroups.com
Привет, Николай! 

Вывод текстовых файлов через OLE - это ну ОЧЕНЬ медленно. И, возможно, требует определённых игр с настройками безопасности, потому как разрешить SQL-серверу выполнять разные манипуляции на диске - не кошерно... 
А при таком количестве выходных файлов абсолютно большую  часть времени займёт именно вывод. 

Учите python, господа... 

С уважением,
Юрий Философов 

2 декабря 2016 г., 13:38 пользователь Nikolay Tsigouro <n.tsi...@gmail.com> написал:



--
С уважением,
Юрий Философов

Вячеслав Черников

unread,
Dec 2, 2016, 7:03:29 AM12/2/16
to clalist
Привет.

2 декабря 2016 г., 14:38 пользователь Nikolay Tsigouro <n.tsi...@gmail.com> написал:

Нет только деклараций _своих_ объектов. Язык процедурный, не ООП. Чем-то похож на Basiс (что совсем не странно - Microsoft, однако ;-)). В последних версиях хранимки можно программить на с#. Там вообще все есть. Клаша (и прежде всего ее объектная модель) просто отдыхает.

Когда посещают грустные мысли, сходи по такой ссылке 


Жизнь многогранна и не делится только на черное и белое... Ты расслабился, Николай?  :-))
 

Nikolay Tsigouro

unread,
Dec 2, 2016, 1:24:34 PM12/2/16
to ClaList
Привет.

2 декабря 2016 г., 14:14 пользователь Юрий Философов <padre...@gmail.com> написал:

Привет, Николай! 

Вывод текстовых файлов через OLE - это ну ОЧЕНЬ медленно.

За скорость ничего не скажу. этим ни разу не пользовался. А есть на транзакте другие решения?
 
И, возможно, требует определённых игр с настройками безопасности, потому как разрешить SQL-серверу выполнять разные манипуляции на диске - не кошерно... 

Думаю не менее кошерно, чем пользоваться другими OLE. И в чем некошерность? Ты работаешь с _текстовыми_ файлами. Даже если там скрипт, как ты его запустишь?
А если вспомнить, что для работы с файлами в SQL2016 появился специальный тип таблиц - FileTable, то похоже, что точка зрения на этот вопрос куда-то дрейфует.
 
А при таком количестве выходных файлов абсолютно большую  часть времени займёт именно вывод. 

А какое их количество? Речь шла о 250000 объектов. Файл, по уму, должен  быть один на тип. И понятно, что аппендить так, как показано в примере, постоянно открывая и закрывая файл не есть гуд.

WBR, Nikolay Tsigouro

Nikolay Tsigouro

unread,
Dec 2, 2016, 1:44:54 PM12/2/16
to ClaList


WBR, Nikolay Tsigouro

2 декабря 2016 г., 15:03 пользователь Вячеслав Черников <fins...@gmail.com> написал:

Привет.

2 декабря 2016 г., 14:38 пользователь Nikolay Tsigouro <n.tsi...@gmail.com> написал:
Нет только деклараций _своих_ объектов. Язык процедурный, не ООП. Чем-то похож на Basiс (что совсем не странно - Microsoft, однако ;-)). В последних версиях хранимки можно программить на с#. Там вообще все есть. Клаша (и прежде всего ее объектная модель) просто отдыхает.

Когда посещают грустные мысли, сходи по такой ссылке 

Ты знаешь, у меня уже год нет поводов для грусти ;-)) А уж грустить по поводу Клариона... ну совсем было бы странно.
 

Пошлятина. Ты бы хоть в ClaTalk это запостил.
 

Жизнь многогранна и не делится только на черное и белое... Ты расслабился, Николай?  :-))
 

 Я не напрягался.

Вячеслав Черников

unread,
Dec 2, 2016, 2:08:33 PM12/2/16
to clalist
Да, мне сейчас тоже кажется пошловатым. Но после просмотра третьей партии рапида Карлсена с Карякиным вполне нечего воспринялось...

2 декабря 2016 г., 22:44 пользователь Nikolay Tsigouro <n.tsi...@gmail.com> написал:

Юрий Философов

unread,
Dec 2, 2016, 3:10:03 PM12/2/16
to cla...@googlegroups.com
Привет, Николай... 

Так я же в ИРМ'е пытался выгружать картинки в файлы на удалённый сервер, как раз скриптами из MS SQL. Файл размером 60-150К выгружался несколько секунд (был написан скрипт, нарезающий блоб на кусочки, которые последовательно выводились), десяток файлов в минуту максимум. 

Кроме того, просто так сервер доступа к этим OLE не даст, такие манипуляции требуют админского доступа и специальных разрешений на использование. Если сервер на настольном компьютере - то да, это несложно. А если нет? 
В общем, у меня на столе получалось, а на удалённом сервере не срослось, открытие доступа к OLE сразу выбрасывало. 
Так что не конфетка... 

С уважением,
Юрий Философов 


2 декабря 2016 г., 21:24 пользователь Nikolay Tsigouro <n.tsi...@gmail.com> написал:

Nikolay Tsigouro

unread,
Dec 2, 2016, 5:36:28 PM12/2/16
to ClaList
Привет. 

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

WBR, Nikolay Tsigouro

2 декабря 2016 г., 23:10 пользователь Юрий Философов <padre...@gmail.com> написал:
Reply all
Reply to author
Forward
0 new messages