|
|
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Здравствуйте ! Есть проходная предприятия, где люди проходя прикладывают пропуск к сканеру. Сканер считывает код и запускает процедуру обработки. Процедура делает следующее 1. Записывает поступивший код в базу (подключена локальная база на .MDB) - логирует 2. Формирует запрос на поиск сотрудника 3. Ищет сотрудника в базе. К ShowEmployee подключён TDataSource и TDBImage+TDBText. Фото и ФИО найденного сотрудника отображается на мониторе. 4. Если сотрудник найден, то он записывается в таблицу регистрации 5. И запускается процедура обработки списка регистрации таймером. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Обработка списка происходит следующим образом1. Если есть в списке люди 2. Создаётся поток, который запускает хранимую процедуру на MSSQL и пытается записать сотрудника в базу 3. Если процедура вернула значение (возвращается ID сотрудника), то есть запись в базу произошла, то этот сотрудник из списка удаляется и таймер запускается снова. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Проблема в следующем. Приблизительно раз-два в неделю, сотрудник(разный) не попадает в базу. Количество сотрудников в день ~4000. При этом его нет ни в таблице ALog ни в таблице EmployeeRegistration. В ALog пишется все полученные коды, а в EmployeeRegistration только найденные сотрудники Но на экране монитора он есть! Это подтверждает камера видеонаблюдения, на которой видно и сотрудника и его фото на мониторе. Помогите пожалуйста с идеей, как объяснить такое поведение. Или с идеей как изменить систему записи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 08:28 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Petrashkevich, Может быть ExecSQL не делает Commit/AutoCommit? В какой момент фиксируется транзакция, до отображения карточки сотрудника, или где-то позже? Что значит "здесь мы удаляем сотрудника если сервер ответил положительно"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 08:51 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
> В какой момент фиксируется транзакция, до отображения карточки сотрудника, или где-то позже? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. >Что значит "здесь мы удаляем сотрудника если сервер ответил положительно"? Есть 2 таблички ALog и EmployeeRegistration. В ALog пишется всё, а в EmployeeRegistration пишутся найденные сотрудники, которые отобразились на экране и которых нужно отослать на сервер. То есть, в EmployeeRegistration формируется список, который нужно выгрузить на сервер. 1. В таймере, перечитывается табличка EmployeeRegistration (список выгрузки). 2. Если там есть данные, то запускается поток в котором идёт попытка вызвать хранимку на Сервере. 3. Если Хранимка ответила положительно (вернула значение ID сотрудника, которого мы пытаемся выгрузить) то этот сотрудник удаляется из выгружаемого списка и запускается таймер снова - пункт №1 4. Если Хранимка не ответила (сбой в сети), то ничего не происходит, сотрудник остаётся в списке и при следующем итерации таймера его снова будут пытаться отослать на сервер. Так таймер и крутится, пока список не пустой. Но это всё лирика, проблема в другом. Сотрудник отображается на экране но его данных нет в ALog. А с ALog ничего не удаляется. Эта таблица введена специально для отслеживания всех поступивших кодов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 09:21 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Petrashkevich, какая то не правильная у вас бизнес-модель. Таймер зачем то приплетен... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 09:29 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
>какая то не правильная у вас бизнес-модель. Пожалуйста, подскажите как правильно >Таймер зачем то приплетен... Таймер для итерации списка. К данной проблеме он отношения не имеет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 09:45 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Petrashkevich >какая то не правильная у вас бизнес-модель. Пожалуйста, подскажите как правильно >Таймер зачем то приплетен... Таймер для итерации списка. К данной проблеме он отношения не имеет MSSQL достаточно мощный инструмент, что бы делать все там. SQL Server Agent -> Jobs (вместо таймера) По факту: на сервер через ХП должен передаваться код и все остальное должен делать сервере. p.s. автор Код: pascal 1. 2. 3. даже не знаю, как без мата охарактеризовать это, без обид ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 09:59 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
>По факту: на сервер через ХП должен передаваться код и все остальное должен делать сервере. Так всё и происходит. Проблема в другом. 1. Сотрудник пишется в таблицу Логирования (локальная таблица Access) 2. Сотрудник отображается на экране (это видно на камере наблюдения) 3. Сотрудник пишется в список отправки на сервер. (локальная таблица Access) Ни в ПЕРВОЙ ни во ВТОРОЙ таблице сотрудника нет, а на экране сотрудник ЕСТЬ!!! И происходит это 1-2 раза в неделю. То есть за 5 дней проходит 5*4000=20 тысяч сотрудников и 1-2 куда то исчезают ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 10:18 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Petrashkevich >По факту: на сервер через ХП должен передаваться код и все остальное должен делать сервере. Так всё и происходит. Проблема в другом. 1. Сотрудник пишется в таблицу Логирования (локальная таблица Access) 2. Сотрудник отображается на экране (это видно на камере наблюдения) 3. Сотрудник пишется в список отправки на сервер. (локальная таблица Access) Ни в ПЕРВОЙ ни во ВТОРОЙ таблице сотрудника нет, а на экране сотрудник ЕСТЬ!!! И происходит это 1-2 раза в неделю. То есть за 50 дней проходит 5*4000=20 тысяч сотрудников и 1-2 куда то исчезают 1) Логирование должно происходить на сервере. На клиенте не должно быть Код: pascal 1. и т.п. 2) Наиболее вероятное поведение, описанное вами, является следствием подвисшей транзакции. Какая причина сбоя, возможно криво передаются данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 10:24 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Gerasimenko 1) Логирование должно происходить на сервере. На клиенте не должно быть Код: pascal 1. и т.п. Как логироване должно происходить на сервере, если сервер недоступен ? Вот оборвалась связь, повис роутер, свет выключили, сервер не стартанул. Где всё это время хранятся данные ? Система работает без наличия сервера в сети. Сервер появился (связь восстановили) все записанные данные сбросились на сервер. Gerasimenko 2) Наиболее вероятное поведение, описанное вами, является следствием подвисшей транзакции. Какая причина сбоя, возможно криво передаются данные. Данных нет ни в ПЕРВОЙ (локальной) таблице ни во ВТОРОЙ (локальной) ни на сервере. Как ГАРАНТИРОВАННО записать в таблицу ACCESSа ? Может быть перевести СПИСОК на отправку в Фаил ? То есть не писать это список в таблицу Access, а писать напрямую в текстовый файл ? Там блокировок не будет ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 10:46 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Petrashkevich Gerasimenko 1) Логирование должно происходить на сервере. На клиенте не должно быть Код: pascal 1. и т.п. Как логироване должно происходить на сервере, если сервер недоступен ? Вот оборвалась связь, повис роутер, свет выключили, сервер не стартанул. Где всё это время хранятся данные ? Gerasimenko 2) Наиболее вероятное поведение, описанное вами, является следствием подвисшей транзакции. Какая причина сбоя, возможно криво передаются данные. Данных нет ни в ПЕРВОЙ (локальной) таблице ни во ВТОРОЙ (локальной) ни на сервере. Как ГАРАНТИРОВАННО записать в таблицу ACCESSа ? 1) вы противоречите себе сами. авторКак логироване должно происходить на сервере, если сервер недоступен ? Тогда у что-то типа TStringList.SaveToFile.Да и в случае разрыва возникнет Exception 2) авторСоздаётся поток, который запускает хранимую процедуру на MSSQL и пытается записать сотрудника в базу зачем еще какой то ACCESS и уж тем более авторСоздаётся поток Вопросов больше чем ответов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 10:55 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Petrashkevich, авторМожет быть перевести СПИСОК на отправку в Фаил ? То есть не писать это список в таблицу Access, а писать напрямую в текстовый файл ? Там блокировок не будет ? Работайте напрямую с MSSQL.Что мешает там создать табличку со списком необработанных данных со сканера и запускать по расписанию Job ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 10:59 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
> вы противоречите себе сами Не виду противоречий > Да и в случае разрыва возникнет Exception Возникает, но гасится в событии OnThreadError, чтобы на экране не всплывало окно с ошибкой доступа. Сервер не ответил положительно, данные из таблички Регистрации не удаляются. >зачем еще какой то ACCESS Там хранится табличка сотрудников с их ФИО и ФОТО. Программа локальная, нужно где-то хранить данные сотрудников. >уж тем более "Создаётся поток" Поток нужен для того, чтобы основная программа не подвисала в ожидании ответа сервера. Если сервер не отвечает, то через таймаут приходит ошибка, которая гасится. Смысл программы - накапливать данные и отсылать их на сервер когда тот появится в сети. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 11:04 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
>Работайте напрямую с MSSQL Сервера нет в сети. Нет связи. Программа накапливает данные и отсылает их, когда связь восстанавливается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 11:05 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Gerasimenko 2) Наиболее вероятное поведение, описанное вами, является следствием подвисшей транзакции. Какая причина сбоя, возможно криво передаются данные. С логами та же история - они пишутся локально в файл. Каждый день - новый файл. Логи можно периодически забрасывать на сервер, если надо их как-то сложно обрабатывать потом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 11:10 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Petrashkevich >Работайте напрямую с MSSQL Сервера нет в сети. Нет связи. Программа накапливает данные и отсылает их, когда связь восстанавливается 1)С потоком все одно не понятно. MSSQL может общаться с ACCESS и наоборот. 2)хранить можно и в ACCESS и в текстовом файле. Причем во втором случае BULK INSERT очень удобен 3) Лучше на форуме по ACCESS спросить, почему откатывает. явного криминала нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 11:16 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Gluck99 Gerasimenko 2) Наиболее вероятное поведение, описанное вами, является следствием подвисшей транзакции. Какая причина сбоя, возможно криво передаются данные. С логами та же история - они пишутся локально в файл. Каждый день - новый файл. Логи можно периодически забрасывать на сервер, если надо их как-то сложно обрабатывать потом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 11:17 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Petrashkevich Сервера нет в сети. Нет связи. Программа накапливает данные и отсылает их, когда связь восстанавливается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 11:22 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Gluck99 Petrashkevich Сервера нет в сети. Нет связи. Программа накапливает данные и отсылает их, когда связь восстанавливается 1)я бы отбросил гипотезы и писал в текстовый файл 2) по доступности сервера : перекладывал файл на сервер. 3) на сервере пускай работает JOB по расписанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 11:25 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Gerasimenko 2) по доступности сервера : перекладывал файл на сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 11:27 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Petrashkevich, мысль 1 У меня такое чувство, что у вас время от времени происходит Exception где то между отображением на экране и логированием. Вот до логирования и не доходит, обрываясь раньше. мысль 2 Так же возможно, что логирование у вас в if <...> then <логирование> и вы упустили какой-то из вариантов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 11:37 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
>С потоком все одно не понятно. Потоком отсылается одна запись из списка накопленных. Почему потоком, чтобы не подвисала основная программа >хранить можно и в ACCESS и в текстовом файле. Причем во втором случае BULK INSERT очень удобен Советуете переделать хранение списка в текст ? >Лучше на форуме по ACCESS спросить, почему откатывает. явного криминала нет Как в Delphi отследить что запись всё таки вставлена и как её ГАРАНТИРОВАННО записать ? >У вас скорее всего проблема с таймером и подключением к Access. Я бы начал с проверки этой гипотезы. Как это можно проверить ? >У меня такое чувство, что у вас время от времени происходит Exception где то между отображением на экране и логированием. Вот до логирования и не доходит, обрываясь раньше. Сначала Логирование(запись в одну таблицу), потом Отображение (чтение из той же базы с другой таблицы), потом вторая запись в другую таблицу. Итого три операции с базой над тремя таблицами. Первая и Третья операции мимо, а средняя работает. >Так же возможно, что логирование у вас в if <...> then <логирование> и вы упустили какой-то из вариантов. У меня первое логирование без всяких условий (запись в ALog). Вторая запись уже по условию, если человек найден ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 12:13 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Petrashkevich Как это можно проверить ? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Как использовать эти операторы посмотрите в справке - там всё исчерпывающе написано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 13:25 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
>Gluck99 Спасибо за идею обернуть в try/except и логировать в файл ошибку. Попробую. Конечно сомневаюсь, поскольку ExecSQL не глотает ошибки и они вываливались бы на экран. Но попытка- не пытка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2020, 14:01 |
|
||
|
Проблема с простеньким кодом
|
|||
|---|---|---|---|
|
#18+
Petrashkevich, Как вариант использовать FB Embedded - мы используем ее в связке с Fib+, еще после вставки записи - можно проверить на успешное выполнение команды вставки. Вообще ЖарПтица практически неубиваемая вещь! ИМХО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2020, 10:25 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39985244&tid=2038106]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 352ms |

| 0 / 0 |
