Страница 1 из 2
ODBC+ABC
Добавлено: 08 Июль 2020, 17:27
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.
Вылет из программы. НО, запись удаляется ! Что за хрень ???
ODBC+ABC
Добавлено: 08 Июль 2020, 18:42
Дед Пахом
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' вообще жесть, не указано, какую запись удалять, хорошо оно всю таблицу не грохнуло.
ODBC+ABC
Добавлено: 08 Июль 2020, 19:59
gromov
Constraint не используется вообще.
DELETE FROM упростил. В программе есть WHERE, т.е все, как положено.
ODBC+ABC
Добавлено: 08 Июль 2020, 20:54
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 идёт синхронизация списков с самими таблицами.
ODBC+ABC
Добавлено: 08 Июль 2020, 21:16
Ал
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
ODBC+ABC
Добавлено: 09 Июль 2020, 8:47
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) выдает ?
ODBC+ABC
Добавлено: 09 Июль 2020, 9:50
kreator
Я что-то не пойму. Вы форме посылаете запрос на удаление, и ещё руками его делаете внутри формы?
ODBC+ABC
Добавлено: 09 Июль 2020, 10:25
gromov
Да. В первом посте я писал, что ручное удаление делается из-за связанных таблиц.
ODBC+ABC
Добавлено: 09 Июль 2020, 10:29
gromov
В форме у таблицы убрал ключ. Стало еще интереснее.
Вызываю форму на удаление.
Ок
Table1 => Entry Not Found
Ок
В форме опять нажимю Ок
Error: (Record not found (35)) attempting to access a record from the Table1 file
Ок
В В форме нажимю Cancel
Форма закрывается и запись удаляется.
Кино.
ODBC+ABC
Добавлено: 09 Июль 2020, 11:11
VWV
В форме у таблицы убрал ключ. Стало еще интереснее.
gromov писал(а): ↑09 Июль 2020, 10:29
предполагаю, что primary key отсутствует
ODBC+ABC
Добавлено: 09 Июль 2020, 11:13
kreator
gromov писал(а): ↑09 Июль 2020, 10:29Кино.
Ещё раз. Не надо делать удаление два раза. Форма и так удаляет эту запись. И похоже отключить это нельзя. Если Вы хотите вручную удалять, то в методе Run на окне, где броуз, нужно сделать обход вызова этой формы.
Я, например, никогда на удаление форму не вызываю. Это какой-то древний подход, пользователь не понимает, что происходит (ИМХО). Я ставлю в свойствах формы на режим "Удаление" вызов "Standart Warning". Всё равно технически вызывается форма, но окно не открывается.
Если Вам нужно удалить руками связанные записи (и у Вас по какой-то причине в словаре не прописана стратегия), то это можно сделать в методе Кill в форме с проверкой Response на RequestCompleted (и естественно учитывая сам Request, должен быть DeleteRecord).
А какая у Вас БД? Если не секрет.
А у MAV принципиально другой подход в отличии от ABC?
ODBC+ABC
Добавлено: 09 Июль 2020, 11:15
kreator
ИМХО, ключ в форме вообще никакой роли не играет. Все формы у меня без ключа. Даже вопрос никогда не возникал по этому поводу.
ODBC+ABC
Добавлено: 09 Июль 2020, 12:11
gromov
Еще раз спасибо. Я фигею от С11 - все заработало. TakeCompleted я обхожу.
Перед Parent call IF SELF.Request-DeleteRecord
после - END. Дальше свой код. База - Firebird 2.1
В MAV все более прозрачно. Там я мог вставить свой код для связанных таблиц и при неуспехе откатить транзакцию. В ABC все закопано черт знает куда.
ODBC+ABC
Добавлено: 09 Июль 2020, 12:29
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
ODBC+ABC
Добавлено: 09 Июль 2020, 13:51
kreator
gromov писал(а): ↑09 Июль 2020, 12:11
В ABC все закопано черт знает куда.
Наверно. Поэтому и руками ничего не пишем. Кстати, commit и rollback не используем, они уже зашиты внутри.
gromov писал(а): ↑09 Июль 2020, 12:11
База - Firebird 2.1
У нас тоже. Только уже третий. Почему нельзя связи описать на уровне сервака, чтобы на клиенте этим не заниматься?