Обновление БД не Г... Ужасные последствия! Помогите!!!

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Юра
Новичок
Сообщения: 26
Зарегистрирован: 30 авг 2005, 17:25
Откуда: Ярославль, Электровозоремонтный завод
Контактная информация:

Обновление БД не Г... Ужасные последствия! Помогите!!!

Сообщение Юра »

(Г 5.85.02, Pervasive) Зарплату у нас перечисляют на пластиковые карты. В Зарплате в лицевых счетах в поле "... стажи работ" (LSCHET.PASPORT) соотв. указан номер лицевого счета. Также настроены потоянные удержания (SHTRAF.NOMLSH).
Банк прислал письмо, где уведомил, что "ввиду изменен. в законодат. изменятся номера счетов" и прислал DBF файл YugraLS, где указал соответствие между новыми и старыми л/с (поля новый, старый л/с).
В виду моей непереносимости Галактического недоSQL, решил использовать стандартные средства: импортнул таблицу YugraLS в Г средствами "Import and Export Data" от MS SQL 2000, и средствами Pervasive Control Center выдал запрос

UPDATE lschet SET lschet.pasport =
(SELECT YugraLS.SC_NEW
FROM YugraLS
where YugraLS.SC_OLD = lschet.pasport)

запрос нормально отработал, но - :shock: О УЖАС, ШЕФ! ВСЕ ПРОПАЛО!
Смотрю ч-з Г в лицевые счета - у кого-то л/с исправлены, а кого-то пропала информация!

Вопрос: чё не так сделал и как исправить?
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

Хм... а что на ВИПе программку написать нельзя? Она же вообще простецкая получится? Взял запись, нашёл лицевой счет. Обновил нужное поле. Сделал апдейт, и всё?

Средствами Pervasive Control Center запросов не делал...
Зачем такие сложности?
Goblin
Местный житель
Сообщения: 474
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Сибирь-матушка
Контактная информация:

Сообщение Goblin »

Repair из Support'а спасет отца русской демократии ...
Только вот если журнализация включена и таблы эти журнализируются, а иначе - только восстановление бэкапа
Питаю патологические отвращение и ненависть в особо тяжелой и крайне запущенной формах к семейству программ Microsoft Business Solution !
Восславим господа Кришну за то, что у нас есть ГАЛАКТИКА !
WiRuc
Местный житель
Сообщения: 414
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж

Сообщение WiRuc »

Информация пропала - это значит, что не для всех pasport были соответствия в YugraLS. Запросы то надо уметь писать, если уж не хотите использовать VIP. И кстати, причем тут MSSQL2000, если используется Pervasive?

Код: Выделить всё

UPDATE lschet SET pasport = YugraLS.SC_NEW 
FROM lschet 
INNER JOIN YugraLS ON YugraLS.SC_OLD = lschet.pasport
Юра
Новичок
Сообщения: 26
Зарегистрирован: 30 авг 2005, 17:25
Откуда: Ярославль, Электровозоремонтный завод
Контактная информация:

Сообщение Юра »

2Goblin
2Алексей
Pervasive Control Center - для баз первасива Галактики самый что ни на есть родной инструментарий, со стандартным (более-менее) диалектом SQL. Естессно, Г и не знала, что её базу правят! Кака-така журнализация? :)
2Алексей
Cложность - это база для подстановки в формате DBF! Какой-такой ВИП? Он может обновлять базу Г в первасиве на основе таблицы DBF?
Кака-така простецкая программа на ВИПе? Проще, чем приведенный мною запрос?
2WiRuc
Подозреваю, что Ваш запрос правильный, но уточните, для какого диалекта SQL? Явно не Галактический недоSQL (они там и слов таких не знают -INNER JOIN, в sql.pdf, во всяком случае, упоминания нет)
Диалект Pervasive.SQL 2000i имеет другой синтаксис:
The UPDATE statement can update only a single table at a time. UPDATE can relate to other tables via a subquery in the SET clause. This can be a correlated subquery that depends in part on the contents of the table being updated, or it can be a non-correlated subquery that depends only on another table.

Correlated Subquery
UPDATE T1 SET T1.C2 = (SELECT T2.C2 FROM T2 WHERE T2.C1 = T1.C1)
Ваш запрос смахивает на стандартный SQL-92, но в какое среде его применить для правки базы Г?
Про MSSQL2000 поясняю - у него есть средства экспорта-импорта "Import and Export Data", создаёшь содинение источник данных ODBC, напр. GAL ("Pervasive ODBC Engine Interface"), источник к DBF, и импортишь! И таблица создастся, и данные в нее закачаются. Тока Support ее не увидит... никогда... А что с него взять, убогого?

Не хочу никого обидеть, просто существует мильён способов выдать SQL-запрос базам Г, в.т.ч. на Первасиве, но не надо ограничиваться Support с его недоSQL! Раширяйте кругозор!
Goblin
Местный житель
Сообщения: 474
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Сибирь-матушка
Контактная информация:

Сообщение Goblin »

Мда, про репайр это я стормозил :-?
Тут только восстановление последнего бэкапа и выкачка из него данных спасет ...

Копилятор интерфейсов, он же VIP(он многое может), закуплен ?
Если да - то простенькой процедуркой(нет, она не проще чем запрос будет, строк на 20 всего) из DBF все вытащится и зальется...
Питаю патологические отвращение и ненависть в особо тяжелой и крайне запущенной формах к семейству программ Microsoft Business Solution !
Восславим господа Кришну за то, что у нас есть ГАЛАКТИКА !
WiRuc
Местный житель
Сообщения: 414
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж

Сообщение WiRuc »

Юра писал(а): Подозреваю, что Ваш запрос правильный, но уточните, для какого диалекта SQL?
Для MSSQL2000.
Если для Pervasive, то можно так:

Код: Выделить всё

UPDATE lschet SET lschet.pasport = 
(SELECT TOP 1 YugraLS.SC_NEW 
FROM YugraLS 
where YugraLS.SC_OLD = lschet.pasport)
WHERE pasport IN (select YugraLS.SC_OLD from YugraLS)
Юра писал(а):Про MSSQL2000 поясняю - у него есть средства экспорта-импорта "Import and Export Data", создаёшь содинение источник данных ODBC, напр. GAL ("Pervasive ODBC Engine Interface"), источник к DBF, и импортишь! И таблица создастся, и данные в нее закачаются. Тока Support ее не увидит... никогда... А что с него взять, убогого?
Ну а чтож тогда просто не создали Linked сервер к Pervasive и не использовали возможности T-SQL для написания запроса?
Юра писал(а): Не хочу никого обидеть, просто существует мильён способов выдать SQL-запрос базам Г, в.т.ч. на Первасиве, но не надо ограничиваться Support с его недоSQL! Раширяйте кругозор!
Я также не хочу вас обидеть, но вот вы и расширили :grin: получили кучу проблем. Надо все таки быть очень осторожным с запросами, которые обновляют целиком всю таблицу.

Теперь только восстанавливать из бэкапа.
Юра
Новичок
Сообщения: 26
Зарегистрирован: 30 авг 2005, 17:25
Откуда: Ярославль, Электровозоремонтный завод
Контактная информация:

Сообщение Юра »

WiRuc писал(а): Если для Pervasive, то можно так:

Код: Выделить всё

UPDATE lschet SET lschet.pasport = 
(SELECT TOP 1 YugraLS.SC_NEW 
FROM YugraLS 
where YugraLS.SC_OLD = lschet.pasport)
WHERE pasport IN (select YugraLS.SC_OLD from YugraLS)
Нет в диалекте первазива TOP N ! Но в принципе, правильно, спасибо. Пока объяснял, сам все понял!
WiRuc писал(а): Ну а чтож тогда просто не создали Linked сервер к Pervasive и не использовали возможности T-SQL для написания запроса?
Спасибо за подсказку, в голову не приходило. Попробуем!

В общем, все вылечили. Восстановили из резервной копии инфу, потом в рабочую загрузили.
На самом деле изначально ошибка была в запросе. Должно быть так:

Код: Выделить всё

UPDATE lschet SET lschet.pasport = 
    (SELECT YugraLS.SC_NEW FROM YugraLS 
     where YugraLS.SC_OLD = schet.pasport)
WHERE pasport IN (select YugraLS.SC_OLD from YugraLS)
тада все будет ОК!

Всем спасибо за участие и помощь!
Юра
Новичок
Сообщения: 26
Зарегистрирован: 30 авг 2005, 17:25
Откуда: Ярославль, Электровозоремонтный завод
Контактная информация:

Сообщение Юра »

списибо,Вам WiRuc!
In Example B, two tables are created and a variety of valid syntax examples are demonstrated. Note the cases where UPDATE fails because the subquery returns more than one row. Note that UPDATE succeeds and NULL is inserted if the subquery returns no rows (where NULL values are allowed).
...
UPDATE T1 SET T1.C2 = (SELECT T2.C2 FROM T2 WHERE T2.C1 = 5) -- update succeeds, NULL is inserted for all rows of T1.C2
ecasoft
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г.Королев МО ООО "Эффективная Комплексная Автоматизация- СОФТ"

Сообщение ecasoft »

Так для сведения...

Тут писали, что ВИП куплен или нет. На самом деле для операций по
моификацию данных ВИП покупать не надо..он и так работает.

Отличие купленного от некупленного в том, что некупленный не создает ресурс и поэтому наработанное невозможно использовать затем в Галактике. Но в тесте, а среде он все делает и выполнит любую модификацию данных или загрузку... :cool:
Goblin
Местный житель
Сообщения: 474
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Сибирь-матушка
Контактная информация:

Сообщение Goblin »

Для отработки запросов - не нужно , конверторы версий все с демо-лицензией идут ... Но не все операции по модификации данных, которые бывает необходимо сделать , можно сделать запросами - и вот тут и приходится писать фейсики по засасыванию, пережеввыванию и пр. возне с данными :cool:
Питаю патологические отвращение и ненависть в особо тяжелой и крайне запущенной формах к семейству программ Microsoft Business Solution !
Восславим господа Кришну за то, что у нас есть ГАЛАКТИКА !
Ответить