Страница 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
У нас тоже. Только уже третий. Почему нельзя связи описать на уровне сервака, чтобы на клиенте этим не заниматься?