ODBC+ABC

ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
gromov
Старожил
Сообщения: 263
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа
Поблагодарили: 3 раза

ODBC+ABC

Сообщение gromov »

Стыдно, конечно, такое спрашивать)) но ...
Пытаюсь слезть с MAV, из названия темы понятно куда. Тупизм полный.
1) Есть листбокс, а в нем поля таблицы FM, IM, OT. Хочу объединить их в локальной переменной. Насколько мне позволяет мой блестящий английский сделать это можно в SetQueueRecord. Но что-то не получается.

2) Есть форма редактирования. TakeCompleted работает только на добавление и редактирование. Удаление делаю сам т.к. есть связанные таблицы. Код:
OF DeleteRecord
loc_NotCompleted = FALSE
LOGOUT(1,Table1,Table2,Table3)
IF ERRORCODE()
loc_NotCompleted = True
MESSAGE('LOGOUT =>' & ERROR())
END
Fstr{Prop:SQL} = 'DELETE FROM Table1'
IF ERRORCODE()
loc_NotCompleted = True
MESSAGE('Table1 =>' & ERROR())
END
! ---
IF ~loc_NotCompleted
Fstr{Prop:SQL} = 'DELETE FROM Table2'
IF ERRORCODE()
loc_NotCompleted = True
MESSAGE('Table2 =>' & ERROR())
END
END
...
IF loc_NotCompleted
ReturnValue = Level:Fatal
ROLLBACK
MESSAGE('Операция не выполнена. Ошибка !!!')
ELSE
COMMIT
ReturnValue = Level:Benign
GlobalResponse = RequestCompleted
POST(EVENT:CloseWindow)
END
END

В листбоксе 2 записи. При попытке удалить первую появляется сообщение:
Error: (Record not found (35)) attempting to access a record from the Table1 file.
Вылет из программы. НО, запись удаляется ! Что за хрень ???
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

ODBC+ABC

Сообщение Дед Пахом »

gromov писал(а): 08 Июль 2020, 17:27 Но что-то не получается.
Значит что-то делаете не так.
gromov писал(а): 08 Июль 2020, 17:27Код:
Код можно бы оформить тегом, разбираться в неотформатированном тексте то ещё удовольствие. Что видно сразу - речь об ABC, но ABC не используется вообще ни разу.
Если в словаре у дочерней таблицы есть Relation к родительской с Constraint on Delete=Cascade, то Relate:PrimaryTable.DeleteRecord(true/false) удаляет родительскую и дочерние записи. Если CascadeServer, то удалится родительская запись, а дочерние должны удаляться триггером на сервере.
'DELETE FROM Table1' вообще жесть, не указано, какую запись удалять, хорошо оно всю таблицу не грохнуло.
С уважением, ДП
gromov
Старожил
Сообщения: 263
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа
Поблагодарили: 3 раза

ODBC+ABC

Сообщение gromov »

Constraint не используется вообще.
DELETE FROM упростил. В программе есть WHERE, т.е все, как положено.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

ODBC+ABC

Сообщение kreator »

gromov писал(а): 08 Июль 2020, 17:27 TakeCompleted работает только на добавление и редактирование. Удаление делаю сам т.к. есть связанные таблицы
Начните с этого. Не надо ничего руками делать.
gromov писал(а): 08 Июль 2020, 17:27 В листбоксе 2 записи. При попытке удалить первую появляется сообщение:
Error: (Record not found (35)) attempting to access a record from the Table1 file.
Вот это скорее всего, что у Вас в броузе (в броузах) что-то странное. Идёт попытка найти запись, которая есть в броузе, в таблице. Часто бывает, например, если в броузе склееное наименование, да ещё с первичным ключом проблема.
При любых действих с броузами на окне в методе UpdateWindow идёт синхронизация списков с самими таблицами.
We are hard at work… for you. :)
Ал
✯ Ветеран ✯
Сообщения: 1011
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия

ODBC+ABC

Сообщение Ал »

gromov писал(а): 08 Июль 2020, 17:27 ...
1) Есть листбокс, а в нем поля таблицы FM, IM, OT. Хочу объединить их в локальной переменной. Насколько мне позволяет мой блестящий английский сделать это можно в SetQueueRecord. Но что-то не получается.
описать loc:FName нужного размера в локальных переменных
с ключом в листбоксе ОК?
в листбоксе после loc:FName можно попробовать вывести какой-ниб. ИД из записи с FM IM ... (можно его "скрыть" - 0 ширина за ненадобностью)
где-то там после

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

 ! Start of "Legacy: Browser, Format an element of the queue"
  ! [Priority 4000]
loc:FName = ''
IF CLIP (FM) <> ''
loc:FName = CLIP (FM) & ...
END

2) удалить в стандартной форме, для других "логически" связанных записей написать хороший запрос чз PROP:SQL или
попробовать написать так, как написали бы для удаления таких записей из файлов TPS в стилистике ABC
gromov
Старожил
Сообщения: 263
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа
Поблагодарили: 3 раза

ODBC+ABC

Сообщение gromov »

Спасибо всем за помощь.
Пример упростил. Стало лучше, но не легче)))

OF DeleteRecord
Relate:Table1.Delete(0)
IF ERRORCODE()
MESSAGE('Table1 =>' & ERROR())
END
END

На выходе имею:
1) Table1 => Entry Not Found
2) Error: (Record not found (35)) attempting to access a record from the Table1 file

Какого хрена, и кто мне это сообщение (2) выдает ?
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

ODBC+ABC

Сообщение kreator »

Я что-то не пойму. Вы форме посылаете запрос на удаление, и ещё руками его делаете внутри формы?
We are hard at work… for you. :)
gromov
Старожил
Сообщения: 263
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа
Поблагодарили: 3 раза

ODBC+ABC

Сообщение gromov »

Да. В первом посте я писал, что ручное удаление делается из-за связанных таблиц.
gromov
Старожил
Сообщения: 263
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа
Поблагодарили: 3 раза

ODBC+ABC

Сообщение gromov »

В форме у таблицы убрал ключ. Стало еще интереснее.
Вызываю форму на удаление.
Ок
Table1 => Entry Not Found
Ок
В форме опять нажимю Ок
Error: (Record not found (35)) attempting to access a record from the Table1 file
Ок
В В форме нажимю Cancel
Форма закрывается и запись удаляется.
Кино.
VWV
Бывалый
Сообщения: 60
Зарегистрирован: 12 Июнь 2015, 22:59
Откуда: Новороссийск
Благодарил (а): 4 раза
Поблагодарили: 1 раз

ODBC+ABC

Сообщение VWV »

В форме у таблицы убрал ключ. Стало еще интереснее.
gromov писал(а): 09 Июль 2020, 10:29
предполагаю, что primary key отсутствует
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

ODBC+ABC

Сообщение kreator »

gromov писал(а): 09 Июль 2020, 10:29Кино.
Ещё раз. Не надо делать удаление два раза. Форма и так удаляет эту запись. И похоже отключить это нельзя. Если Вы хотите вручную удалять, то в методе Run на окне, где броуз, нужно сделать обход вызова этой формы.
Я, например, никогда на удаление форму не вызываю. Это какой-то древний подход, пользователь не понимает, что происходит (ИМХО). Я ставлю в свойствах формы на режим "Удаление" вызов "Standart Warning". Всё равно технически вызывается форма, но окно не открывается.
Если Вам нужно удалить руками связанные записи (и у Вас по какой-то причине в словаре не прописана стратегия), то это можно сделать в методе Кill в форме с проверкой Response на RequestCompleted (и естественно учитывая сам Request, должен быть DeleteRecord).
А какая у Вас БД? Если не секрет.
А у MAV принципиально другой подход в отличии от ABC?
We are hard at work… for you. :)
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

ODBC+ABC

Сообщение kreator »

ИМХО, ключ в форме вообще никакой роли не играет. Все формы у меня без ключа. Даже вопрос никогда не возникал по этому поводу.
We are hard at work… for you. :)
gromov
Старожил
Сообщения: 263
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа
Поблагодарили: 3 раза

ODBC+ABC

Сообщение gromov »

Еще раз спасибо. Я фигею от С11 - все заработало. TakeCompleted я обхожу.
Перед Parent call IF SELF.Request-DeleteRecord
после - END. Дальше свой код. База - Firebird 2.1
В MAV все более прозрачно. Там я мог вставить свой код для связанных таблиц и при неуспехе откатить транзакцию. В ABC все закопано черт знает куда.
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

ODBC+ABC

Сообщение gopstop2007 »

gromov писал(а): 09 Июль 2020, 12:11 Там я мог вставить свой код для связанных таблиц и при неуспехе откатить транзакцию. В ABC все закопано черт знает куда.
может так?

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

   r_sql = 'Delete FROM myFile WHERE id=5 ;'
   myFilel{PROP:SQL} = r_sql

    IF ERRORCODE() 
        Message('Удаление: '& FILEERROR() &': '& ERROR())
        !ROLLBACK
   	myFilel{PROP:SQL} = 'ROLLBACK'
    END
    myFilel{PROP:SQL} = 'COMMIT'
    !COMMIT
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

ODBC+ABC

Сообщение kreator »

gromov писал(а): 09 Июль 2020, 12:11 В ABC все закопано черт знает куда.
Наверно. Поэтому и руками ничего не пишем. Кстати, commit и rollback не используем, они уже зашиты внутри.
gromov писал(а): 09 Июль 2020, 12:11 База - Firebird 2.1
У нас тоже. Только уже третий. Почему нельзя связи описать на уровне сервака, чтобы на клиенте этим не заниматься?
We are hard at work… for you. :)
Ответить