cro-logo      
Добро пожаловать, Гость. Пожалуйста, выберите Вход

 
 
  ГлавнаяСправкаПоискВход  
 
Страниц: 1 2 
Послать Тему Печать
Несколько вопросов по CronosPro (Прочитано 5 524 раз)
kasian
Профи
****
Вне Форума


Опытный пользователь Cronos
для DOS

Сообщений: 152
Несколько вопросов по CronosPro
18.06.2010 :: 15:06:34
 
1.      Почему при открытии из формы корневой записи подчиненной формы методом OpenSubForm создается пустая запись (в свойствах формы: пустая запись-нет, новая запись-нет, ввод новых-нет), которая не является новой (т.е. Код:
Me.Record.IsNewRecord равен false)? 


2.      При тех же условиях, только если к корневой записи уже привязаны записи из базы, в которую хотим перейти по OpenSubForm, при обработке в событии Open открывшейся формы, добавим создание новой записи методом Код:
Me:NewRecord(), 

и потом проверим методом Код:
Me.Record.IsNewRecord, 

в этом случае запись считается также не новая (т.е. равно false)?
3.      В каком случае она считается тогда новой?
4.      Если я хочу форму использовать и для ввода новых записей и для коррекции ранее введенных, то какое свойство форме я должен присвоить (ввод новых, новая запись, пустая запись)? И могу ли я программно устанавливать эти свойства форме?
5.   Метод   Код:
base:CheckRecordLock ( Me.RecordNumber ) 

 только у меня не работает или у всех?  
6.  Тот же вопрос и по Код:
Me:ReloadRecord() 



(v.4.0.501)
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 006
Санкт-Петербург
Re: Несколько вопросов по CronosPro
Ответ #1 - 19.06.2010 :: 15:54:39
 
Внимательно почитайте документацию или справку к свойствам формы, где написано:
Пустая запись - при выходе с последнего элемента формы по циклу табуляции в форме будет создана новая запись.
Т.е. это никак не влияет на режим открытия формы.
Новая запись - при запуске формы создается и становится текущей новая запись.
Ввод новых - в форме доступен только ввод новых записей. Все имеющиеся записи игнорируются.
Вы неправильно воспринимаете суть происходящего в формах. Банк - банком, а формы - формами. Это немного разные вещи. Свойство IsNewRecord применимо к классу Form. Для класса Record такого свойства нет и быть не может по определению. Record это уже существующая запись в банке, а форма - это некий "своеобразный буфер", в который вводятся данные для последующей загрузки в банк. Пока форма (запись в форме) не сохранена она и считается новой. При коррекции, сама то запись в банке существует уже, а вот изменяемые и дополняемые поля существуют только в форме до момента сохранения.
Т.о. свойство Код:
Me.Record.IsNewRecord должно быть всегда равно nil, 

и даже не false, т.к. его нет.
Это 1-й, 2-й и 3-й вопросы, но относится и ко всем остальным.
3. Если Вы хотите использовать форму и для ввода новых записей и для коррекции ранее введенных, то пррименяйте:
пустая запись-да или нет безразлично(см. выше), новая запись-нет, ввод новых-нет. Будет доступна и коррекция и ввод новых данных. Программно можно вызывать создание новой записи.
4. Метод   Код:
base:CheckRecordLock ( Me.RecordNumber ) 

у Вас всегда будет выдавать true по определению. Вы работаете в форме с записью, которая и блокируется при её загрузке в форму. А Вы пытаетесь проверить это свойство. Т.е. Вы пытаетесь себя спросить, - "а при мне ли моя голова", но если Вы думаете, то это очевидно где она.
5. Код:
Me:ReloadRecord() 

- из приведённых выше объяснений тоже очевидно, что метод не будет работать для вновь созданных объектов, потому что перечитывать из банка ещё нечего. Не сохранена там ещё эта запись.
Наверх
 
 
IP записан
 
kasian
Профи
****
Вне Форума


Опытный пользователь Cronos
для DOS

Сообщений: 152
Re: Несколько вопросов по CronosPro
Ответ #2 - 21.06.2010 :: 12:09:29
 
Zuluss писал(а) 19.06.2010 :: 15:54:39:
...

Спасибо за ответы.

1.,2. Я давно в курсе, что форма – это некий буфер, знаю, что пока запись не сохранена – это новая запись, это все базовые понятия. Про свойство «пустая запись» раньше читал, просто не сразу вспомнил. В CroPlus было понятие запись-пустышка, думал – это свойство для создания такой записи. Об остальных свойствах тоже знаю, спасибо что напомнили. Однако по поводу Me.Record не логично получается, вот описание из справочника по Lua:
«Me.Record - Содержит текущую запись формы. Значением свойства является объект Record, соответствующий текущей записи формы» (а не банка!!!).
Как я (вероятно неправильно) понимал ранее, если я программно создал запись (Me:NewRecord()) и пока не сохранил ее, то Me.Record – это и будет та запись которую я создал в форме, т.к. Me – это текущая форма. Я же не обращаюсь к записи из банка, например таким способом Код:
GetBank():GetBase("АА"):GetRecord (125). 


По факту, Вы конечно же правы, проверил, тогда в инструкции ошибка? Как я могу тогда обратиться к текущей пока несохраненной записи формы, если не через Me.Record?

3. У меня все перечисленные свойства установлены в «нет», тем не менее, при открытии формы по OpenSubForm, открывается новая запись, почему?

4. Может я неправильно объяснил или не до конца, ситуация такая, я открыл форму ввода, заполнил поля, закрыл, потом решил через эту же форму откорректировать эту же запись, но не могу, она оказывается заблокированной. Банк локальный, кроме меня никто не работает с записью. Я хочу узнать, на каком этапе идет блокировка. Наверняка ошибка где-то в коде. Как мне программно проверить блокировку записи в форме?

5. Me:ReloadRecord() не работал у меня на сохраненной записи, в режиме ее коррекции, после связки двух записей непосредственно в банке методом AddLink, прошу прощения, что не достаточно подробно объяснил. Вместо Код:
Me:ReloadRecord() сработал вариант Me.RecordNumber = Me.RecordNumber, 

как это объяснить?
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 006
Санкт-Петербург
Re: Несколько вопросов по CronosPro
Ответ #3 - 21.06.2010 :: 18:31:52
 
kasian писал(а) 21.06.2010 :: 12:09:29:
... Как я могу тогда обратиться к текущей пока несохраненной записи формы, если не через Me.Record?

Для большинства случаев извлечения данных Вы можете обратится через методы самой формы или размещённых в ней объектов. Например, Код:
Me.поле1_1:GetValue(). 

Несколько сложнее обратиться к  связным полям, особенно если используете OpenSubForm. Тогда придётся из субформы передавать параметры в форму её вызвавшую. Особенно проблематично обращаться в форме к полям типа файл. Гораздо проще сохранить в банк основную и подчинённые формы и уже из банка с ними работать. Но пока открыта форма, записи (основная и подчинённые) всё равно будут заблокированы.
kasian писал(а) 21.06.2010 :: 12:09:29:
3. У меня все перечисленные свойства установлены в «нет», тем не менее, при открытии формы по OpenSubForm, открывается новая запись, почему?

Она пустышка и при сохраненении (закрытии) формы должна удалиться. Если есть другие подчинённые записи, то пустышка не появляется. Это вполне резонно и логично. Если Вы хотите заполнить подчинённую запись и нажали на кнопку её открытия, Вы должны в её поля внести какие то значения, т.е. всё равно должны её заполнить. В противном случае Вам бы приходилось всё равно открывать новую запись.
kasian писал(а) 21.06.2010 :: 12:09:29:
открыл форму ввода, заполнил поля, закрыл, потом решил через эту же форму откорректировать эту же запись, но не могу, она оказывается заблокированной.

Такой глюк был в некоторых сборках, но сейчас вроде всё работает нормально.
kasian писал(а) 21.06.2010 :: 12:09:29:
5. Me:ReloadRecord() не работал у меня на сохраненной записи, в режиме ее коррекции, после связки двух записей непосредственно в банке методом AddLink. Вместо Me:ReloadRecord() сработал вариант Код:
Me.RecordNumber = Me.RecordNumber, 

как это объяснить?

Трудно что то объяснить не видя скрипта формы. AddLink работает с разблокированными записями сразу, а с заблокированными может ожидать снятия блокировки. Поэтому произвести такое действие над записью формы не получится. Скорее всего получается так, что во время действия Me.RecordNumber снимается блокировка записи и производится установление связи, а во время выполнения Me:ReloadRecord()  снятия блокировки не происходит.
Наверх
 
 
IP записан
 
kasian
Профи
****
Вне Форума


Опытный пользователь Cronos
для DOS

Сообщений: 152
Re: Несколько вопросов по CronosPro
Ответ #4 - 22.06.2010 :: 09:03:59
 
Спасибо, кое что стало ясно!  Улыбка
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Несколько вопросов по CronosPro
Ответ #5 - 12.01.2022 :: 17:51:12
 
извиняюсь, что поднимаю старую тему, но есть вопрос по "коррекции в форме ввода"

у меня есть список со значениями, по двойному клику в строке у меня открывается форма ввода с тем значением, на которое я кликнул

Но проблема в том, что эта запись заблокирована. Я не могу её редактировать. На форме включены кнопки навигации: так запись перед и запись после можно редактировать, а выбранную (переданную из списка) нельзя.

форма со списком

Цитата:
qqq = Arg.list -- в форму передаем RecordSet из запроса по образцу

function список1_DoubleClik(control, event)
   local formArg = {}
   formArg.new = false
   local index = Me.список1.SelectedIndex
   local rec = qqq:GetRecordByIndex(index)
   formArg.sn = rec:GetValue(0)
   CroApp.GetBank(): OpenForm(1, 1, Me, formArg)
end



форма создание записи

Цитата:
function Форма_Load(form)
   if Arg then
      if Arg.new then
         if Me.IsNewRecord ~= true then
             Me:NewRecord()
         end
      else
         --local record = CroApp:GetBank():GetBase(1):GetRecord(Arg.sn)
         local block = CroApp:GetBank(1):CheckRecordLock(record.SN)        ----- пишет, что заблокировано
         --Me.RecordNumber = tonumber(record.SN)
         Me.RecordNumber = tonumber(Arg.sn)
      end
   end
end


выбранная запись отображается правильно на форме ввода

в форме ввода записи поля: Редактировать, Удаление, Добавление - ДА
доступ тоже включена - Коррекция

что я делаю не так? почему не могу редактировать выбранную запись?

Спасибо
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 006
Санкт-Петербург
Re: Несколько вопросов по CronosPro
Ответ #6 - 12.01.2022 :: 18:23:16
 
А форма, где расположен список, управляющая или ввода?
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Несколько вопросов по CronosPro
Ответ #7 - 12.01.2022 :: 18:25:14
 
форма ввода, конкретной базы

у управляющей формы нельзя, точнее их просто нет, настраивать режимы: редактировать, удалять, добавлять
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 006
Санкт-Петербург
Re: Несколько вопросов по CronosPro
Ответ #8 - 12.01.2022 :: 18:26:52
 
Той же базы, что и редактируемая запись?
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Несколько вопросов по CronosPro
Ответ #9 - 12.01.2022 :: 18:28:28
 
да
у меня одна корневая база
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 006
Санкт-Петербург
Re: Несколько вопросов по CronosPro
Ответ #10 - 12.01.2022 :: 18:31:27
 
Скорее всего поэтому и блокируется.
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Несколько вопросов по CronosPro
Ответ #11 - 12.01.2022 :: 18:37:32
 
а как можно это обойти?

Хотелось бы использовать одну форму для ввода и коррекции

если редактировать запись стандартными средствами Кронос, то всё работает. Простой запрос -> коррекция -> без проблем можно изменить любую запись

А вот через форму не хочет, при этом, как я писал, можно редактировать запись перед и запись после выбранного мною SN
Кнопками навигации хожу по записям и на той, что передал из формы со списком (по двойному клику) блок, а остальные пожалуйста
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Несколько вопросов по CronosPro
Ответ #12 - 12.01.2022 :: 18:40:11
 
а если Me.RecordNumber указываю номер в коде, то тоже могу редактировать эту запись

как так?

Цитата:
Me.RecordNumber = 34
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 006
Санкт-Петербург
Re: Несколько вопросов по CronosPro
Ответ #13 - 12.01.2022 :: 18:53:31
 
неправильно Цитата:
local block = CroApp:GetBank(1):CheckRecordLock(record.SN)

Код:
 CroApp:GetBank():GetBase(1):CheckRecordLock(Arg.sn) 

Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Несколько вопросов по CronosPro
Ответ #14 - 12.01.2022 :: 18:57:31
 
это да, но значение в Arg.Sn и record.SN одно и тоже

да и на блокировку это не влияет
Наверх
 
 
IP записан
 
Страниц: 1 2 
Послать Тему Печать