Транзакция в форме

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
artgkx
Бывалый
Сообщения: 58
Зарегистрирован: 25 Декабрь 2010, 12:23

Транзакция в форме

Сообщение artgkx »

Clarion 9.1. В Form Детей вычисляются остатки и обновляются в Отце.
Хотел завернуть в транзакцию. При добавлении вроде бы работает.
При удалении ошибка (Logout Alreade aktive (56) ...)
Код

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

ThisWindow.TakeCompleted PROCEDURE

ReturnValue          BYTE,AUTO

! Start of "WindowManager Method Data Section"
! [Priority 3500]

Looped BYTE
! [Priority 8500]

! End of "WindowManager Method Data Section"
  CODE
  ! Start of "WindowManager Method Executable Code Section"
  ! [Priority 1300]
  
  LOOP
    IF Looped
      RETURN Level:Notify
    ELSE
      Looped = 1
    END
   
  ! [Priority 4000]
  IF SELF.Request<>ViewRecord
         Logout(5,schet,opl)
    sch:idsch = opl:idsch
    GET(schet,sch:byidsch)  !перечитать запись
    IF errorcode() then stop(error()&'Get(schet)'&sch:idsch).
    Case Self.Request
    OF InsertRecord  
         IF opl:sumopl > (sch:itogo - sch:sumopl)
            MESSAGE('Сумма оплаты больше  суммы по счету! ')
            opl:sumopl =  (sch:itogo - sch:sumopl) 
            ReturnValue = Level:Fatal 
              ROLLBACK
            RETURN ReturnValue
         .    
        sch:sumopl = (sch:sumopl + opl:sumopl)
    OF DeleteRecord
        sch:sumopl = (sch:sumopl - opl:sumopl)
    .    
  .  
  ! Parent Call
  ReturnValue = PARENT.TakeCompleted()
  ! [Priority 6500]
    IF SELF.Request<>ViewRecord
      Case Self.Response
      OF  1   
          Put(schet)
          IF errorcode() then stop(error()&'Put(schet)').
           Commit
      Else 
           ROLLBACK
      .    
    .  
     RETURN ReturnValue
  END
  ReturnValue = Level:Fatal
  ! [Priority 8800]
  
  ! End of "WindowManager Method Executable Code Section"
  RETURN ReturnValue
Подскажите как правильно.
MESSAGE - почему не отражает полностью? В С 6.3 отражается правильно.
И еще вопрос: на Windows 7, 8 функция GetReg() ничего не возвращает.
kreator
✯ Ветеран ✯
Сообщения: 5160
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Транзакция в форме

Сообщение kreator »

Начнём с конца. Getreg'у нужен параметр, типа:

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

GETREG(REG_LOCAL_MACHINE,'SOFTWARE\SoftVelocity\Clarion10','root')
Чтобы message не обрезал, пишем:

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

System{prop:Font} = 'Arial'
или другой шрифт (Segoe UI, например). Пишем при запуске программы, где русификация.
По поводу транзакций. Мне кажется нужно отказаться от схемы, шаблоны (классы) могут сами что-нибудь такое генерить. Потом, logout блокирует таблицу. Как бы не нарваться на глобальный локаут. Просто пиши в родительскую таблицу и всё (без этих операторов). А ещё лучше - вообще не пиши ничего, рассчитывай в рантайме.
We are hard at work… for you. :)
artgkx
Бывалый
Сообщения: 58
Зарегистрирован: 25 Декабрь 2010, 12:23

Транзакция в форме

Сообщение artgkx »

GETREG() - с параметрами работает на Windows XP, а на Windows 7, 8 - пусто. Хотя REGEDIT под этим же пользователем
запускается.
В Program Setup

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

Locale('Windows')
SYSTEM{PROP:Font}='Arial'
SYSTEM{prop:charset}=charset:cyrillic
SYSTEM{PROP:TipsFont} = CHARSET:CYRILLIC
обрезает, а в приложении сгенеренном Сlarion 6.3 с этим же Program Setup отражается правильно. Поэтому и вопрос.

По поводу записи в родительскую таблицу - logout перед самой записью на диск детей, и тут же сверяем остатки.
И запись в транзакции родителей. И тут же транзакция закрывается. Блокироваться должна на момент записи,
вроде бы. Хотелось сделать дешево и сердито - но не получается. Опыта маловато.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8031
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Транзакция в форме

Сообщение Игорь Столяров »

Попробуйте убрать все, что написал и сделать вот так (строки местами не менять).

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

  Locale('CLACHARSET','WINDOWS')
  SYSTEM{Prop:CharSet} = CHARSET:CYRILLIC
  SYSTEM{PROP:Font}    = 'Arial'


Еcли все равно будут обрезаться строки в MESSAGE() - давай пример тестовой строки и снимок проблемы, проверим ... ;)
Make Clarion Great Again ! 😎
artgkx
Бывалый
Сообщения: 58
Зарегистрирован: 25 Декабрь 2010, 12:23

Транзакция в форме

Сообщение artgkx »

В таком варианте не обрезается! Большое спасибо за подсказку.
А как насчет остального? Может кто знает.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8031
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Транзакция в форме

Сообщение Игорь Столяров »

artgkx писал(а): Хотел завернуть в транзакцию.
А можно нескромный вопрос: зачем ? Какой ожидается эффект от этого действия ?
Make Clarion Great Again ! 😎
artgkx
Бывалый
Сообщения: 58
Зарегистрирован: 25 Декабрь 2010, 12:23

Транзакция в форме

Сообщение artgkx »

В случае сбоя, обрыва сети и т.д., предполагал сохранения правильности остатков и расхода.
Прошу прощения за корявость выражения.
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Транзакция в форме

Сообщение gopstop2007 »

а не проще по завершению операции - посчитать или пересчитать остаток на отце или дитё -товар? Можно даже параллельно считать и записывать
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8031
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Транзакция в форме

Сообщение Игорь Столяров »

Насколько я смог понять из кода - сумма оплаты соответствует документам на оплату ...
Попробуйте - решит ли это проблему при сбое .... А что бы не было сообщений - отключите
штатную обработку транзакций в шаблонах для нужных файлов:
6000.jpg
Make Clarion Great Again ! 😎
kreator
✯ Ветеран ✯
Сообщения: 5160
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Транзакция в форме

Сообщение kreator »

artgkx писал(а):GETREG() - с параметрами работает на Windows XP, а на Windows 7, 8 - пусто. Хотя REGEDIT под этим же пользователем
запускается.
Тоже код в студию. Всё работает, проблем не замечено.
Давным-давно делал такую вещь (родитель-дитя) ещё на DAT-файлах, намаялся аж жуть. Вопрос: а вариант редактирования дитя не отрабатывается? Под запретом?
И всё же я бы сделал проще: если у дитя self.Response=RequestCompleted, то пытаемся писать в родителя. И всё.
We are hard at work… for you. :)
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Транзакция в форме

Сообщение Алексей- Софт-Центр »

Добрый день.

Getreg работает без проблем во всех виндах.
А ничего не возвращает, вероятнее всего, неправильно задана ветка или параметр. Просто там такого значения нет.

Алексей
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

Транзакция в форме

Сообщение Shur »

Вопрос: открывается ли собственно форма при удалении или только сообщение? Если мне не изменяет память, то там немного разная обработка. Поэтому надо выяснить точное место возникновения ошибки.

Доп. вопрос: многопользовательская ли это программа и может ли быть доступ к одному счёту более чем у одного человека? Если да, то +- делать нельзя -- перед обновлением счёта нужно просуммировать все оплаты, после этого обновлять счет.
kreator
✯ Ветеран ✯
Сообщения: 5160
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Транзакция в форме

Сообщение kreator »

Shur писал(а):Вопрос: открывается ли собственно форма при удалении или только сообщение? Если мне не изменяет память, то там немного разная обработка. Поэтому надо выяснить точное место возникновения ошибки.
В первом посте написано - "Form". Но даже если указать, что на удаление не вызывать форму (а просто сообщение), то всё равно отработает форма. Здесь всё правильно. Другое дело, если редактирование в EIP.
Shur писал(а):Доп. вопрос: многопользовательская ли это программа и может ли быть доступ к одному счёту более чем у одного человека? Если да, то +- делать нельзя -- перед обновлением счёта нужно просуммировать все оплаты, после этого обновлять счет.
На сто процентов согласен. Куча проблем может вылезти. Поэтому, может не надо, a? И теория БД не приветствует такую организацию баз данных.
We are hard at work… for you. :)
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

Транзакция в форме

Сообщение Shur »

Ну на то она и теория. Денормализация -- вещь не только вредная, но и полезная.
Дежурно повторю, что для обновления суммы оплаты счета лучше сделать вставку в FileManager'е или, ещё лучше, написать кларионовские триггеры для данной таблицы в словаре данных. Тогда всё будет действительно "по теории" (не реляционной, но СУБДшной).
artgkx
Бывалый
Сообщения: 58
Зарегистрирован: 25 Декабрь 2010, 12:23

Транзакция в форме

Сообщение artgkx »

Спасибо за подсказки. Что-бы было понятно, это не бухгалтерия, а больше информационное приложение.
Попросила знакомая, всего 4 таблицы. При вводе оплаты по счету (а их может быть несколько - частичная оплата),
оператор вводила суммы, сумма которых больше суммы счета. Поэтому ввел в таблице счетов "остаток на счете".
Чтобы оператор не напутала (а такое было), при добавлении или удалении (изменять нельзя) суммы оплаты, при
записи (TakeCompleted) проверяется остаток на счете (Get или Fetch на родителя). Если правильно TakeCompleted продолжается и PUT(родителя) с новым значением остатка .
А транзакция блокирует таблицы только на время записи.
В Form есть #EXTENSION(SaveButtonTransactionFrame,'Generate a transaction frame on a form'), он это делает.
С ошибкой разобрался, СПАСИБО всем! Учусь.
Ответить