2017-01-09 2 views
0

Вот коды для передачи одного параметра в другом объекте окна pb.Передача нескольких параметров в OpenWithParm в Powerbuilder

в dw_header щелкнул событие

long ll_customer 
datetime dt_from, dt_to 
ll_customer = getitemnumber(1,"customer_id") 
dt_from = datetime(date(f_today()),time('00:00:00')) 
dt_to = datetime(date(f_today()),time('23:59:59.99')) 

openwithparm(w_customer_balance,ll_customer) 

в w_customer_balance открытом мероприятии

long ll_id 
datetime dt_from, dt_to 
ll_id = message.doubleparm 
dw_1.settransobject(sqlca) 
dw_1.retrieve(ll_id) 

Это отлично работает нормально при прохождении одного параметра. Но я хочу передать другие параметры w/c: dt_from и dt_to в окно баланса клиента.

Кто-нибудь?

ответ

1

Если вам нужно передать несколько параметров, вы можете использовать следующий этот метод:

Определение структурных переменных: lstr_declaredstr, который включает в себя вы хотите передать параметры:

Тип переменной имя переменной:

ID Unsignedlong; Имя Характер; Email Character; Главная Character

... ...

Вызов сценария, используйте следующий код:

lstr_declaredstr lstr_parmtotrans 
lstr_parmtotrans.id = 1 
lstr_paramtotrans.name = "panya" 
lstr_paramtotrans.email = "[email protected]" 
lstr_paramtotrans.homepage = "http://panya.163.net" 

...

openwithparm (w_wantparm, lstr_paramtotrans) 

Затем откройте окно в w_wantparm под открытым небом для получения структурной информации:

lstr_declaredstr lstr_getparm 
integer li_getid 
string ls_getname 
string ls_getemail 
string ls_gethomepage 
lstr_getparm = message.powerobjectparm 
li_getid = lstr_getparm.id 
ls_getname = lstr_getparm.name 
ls_geemail = lstr_getparm.email 
ls_gethomepage = lstr_getparm.homepage 

Дополнительные примеры: web

+0

мне нужно делать создать структуру с именем lstr_declaredstr? –

+0

Да, создайте структуру. Является опцией для прохождения параметров –

+0

А потом и в w_wantparm мне нужно создать структуру lstr_declaredstr? –

1

Вы также можете определить не визуальный объект с переменными экземпляра, которые вы установили, а затем передать вызов метода Openwithparm. Вызываемому окну должно быть создано nvo (обычно как переменная экземпляра), а затем «получено» в открытом событии с помощью параметра параметра powerobjectparm.

+0

i Dont понять что-то: D. Извините, я немного новичок в powerbuilder. Можете ли вы предоставить образцы? –

0

Как предложил Мэтт Balent, вместо того, чтобы определять структуру специально для передачи некоторых параметров в окне, вы можете создать специальный объект, передаваемый OpenWithParm() и которые могут быть получены в open() с message.powerobjectparm (потому что вы можете пройти любой powerobject к этому методу).

Посредством расширения вы можете создать общий тип объекта, который может принимать произвольное количество именованных параметров типа any, которые вы можете получить по их имени в событии open() способом, аналогичным структуре. Это своего рода словарь бедного человека.

Вот Exemple на основе некоторого существующего кода:

  • на nv_va_arg объекта (например, переменных типа аргументов языка C) - источник копируется из объекта «редактировать источник» контекстное меню, чтобы воссоздать объект, добавить новый «пользовательского класса» объект с именем nv_va_args, сохраните его, то правой кнопкой мыши «источник редактировать» и вставьте следующий код:
 forward 
     global type nv_va_args from nonvisualobject 
     end type 
     end forward 

     global type nv_va_args from nonvisualobject autoinstantiate 
     end type 

     type variables 

     private: 
     string _is_names[] 
     any _ia_items[] 

     end variables 
     forward prototypes 
     public subroutine add_item (string as_name, any aa_val) 
     private function integer search (string as_name) 
     public subroutine set_item (string as_name, any aa_val) 
     public function any get_item (string as_name) 
     private subroutine set_item (integer ai_index, string as_name, any aa_val) 
     public function integer size() 
     public function string get_name (integer ai_index) 
     public function any get_item (integer ai_index) 
     end prototypes 

     public subroutine add_item (string as_name, any aa_val); 
     /* add a new item if not already present */ 

     int idx 

     idx = search(as_name) 
     if idx = -1 then 
      idx = upperbound(_is_names) + 1 
      set_item(idx, as_name, aa_val) 
     end if 

     end subroutine 

     private function integer search (string as_name); 
     /* search for an item */ 

     int i, n 
     n = upperbound(_is_names) 

     for i = 1 to n 
      if _is_names[i] = as_name then return i 
     next 

     return -1 

     end function 

     public subroutine set_item (string as_name, any aa_val); 
     /* public setter */ 
     int idx 

     idx = search(as_name) 
     if idx =-1 then 
      idx = upperbound(_is_names) + 1 
     end if 
     set_item(idx, as_name, aa_val) 

     end subroutine 

     public function any get_item (string as_name); 
     /* get the named item */ 

     int idx 
     any la_val 

     idx = search(as_name) 
     if idx > 0 then 
      la_val = _ia_items[idx] 
     end if 

     return la_val 

     end function 

     private subroutine set_item (integer ai_index, string as_name, any aa_val); 
     /* internal setter */ 

     _is_names[ai_index] = as_name 
     _ia_items[ai_index] = aa_val 

     end subroutine 

     public function integer size(); 
     /* return the number of elements */ 
     return upperbound(_is_names) 

     end function 

     public function string get_name (integer ai_index); 
     /* return the name of the nth item */ 

     string ls_ret = "" 
     if ai_index > 0 and ai_index <= upperbound(_is_names) then 
      ls_ret = _is_names[ai_index] 
     end if 

     return ls_ret 

     end function 

     public function any get_item (integer ai_index); 
     /* get the named item */ 

     any la_val 

     if ai_index > 0 and ai_index <= upperbound(_is_names) then 
      la_val = _ia_items[ai_index] 
     end if 

     return la_val 

     end function 

     on nv_va_args.create 
     call super::create 
     TriggerEvent(this, "constructor") 
     end on 

     on nv_va_args.destroy 
     TriggerEvent(this, "destructor") 
     call super::destroy 
     end on 
  • exampl е заполнения параметров, вы можете использовать любое имя и любой тип, который будет храниться во внутреннем any массиве nv_va_args объекта:
 nv_va_args lva_args 

     //set some values 
     lva_args.add_item("arg_1", 42) 
     lva_args.add_item("arg_2", "foo bar") 

     //change a value 
     lva_args.set_item("arg_2", "foo baz") 

     openwithparm(w_test, lva_args) 
  • 2 примеры аргументов ВОССТАНОВЛЕНИЕ, заложенную в open() случае из окно. Обратите внимание, что поиск объекта из message объекта должен быть сделан в начале мероприятия для не теряет свою ценность (message объекта является глобальным объектом, который может быть перезаписан довольно быстро)
 powerobject lpo_arg //do not create it, as it is autoinstanciated 
     lpo_arg = message.PowerObjectParm //make immediate copy of the message 
     nv_va_args lva_args 

     if isvalid(lpo_arg) and not isnull(lpo_arg) then 
      lva_args = lpo_arg 
     end if 

     //example: enumerate all the parameters 
     string ls_msg = "", ls_class 
     int i 
     any la_val 
     for i = 1 to lva_args.size() 
      ls_msg = ls_msg + lva_args.get_name(i) + ': ' 
      la_val = lva_args.get_item(i) 
      ls_class = classname(la_val) 
      if ls_class = "string" or ls_class = "long" then 
       ls_msg = ls_msg + string(la_val, "[general]") 
      else 
       ls_msg = ls_msg + '[' + ls_class + ']' 
      end if 
      ls_msg = ls_msg + "~r~n" 
     next 
     messagebox("list of parameters", ls_msg) 

     //example: just get a named parameter 
     string ls_name = "arg_2" 
     la_val = lva_args.get_item(ls_name) 
     ls_msg = ls_name + " is " + string(la_val, "[general]") 
     messagebox("named parameter", ls_msg) 
+0

Почему downvote? Мой ответ отлично подходит для заданного вопроса. – Seki

Смежные вопросы