Inscription over the DCBROWSE window with data from DCADDBUT

This forum is for eXpress++ general support.
Message
Author
User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Inscription over the DCBROWSE window with data from DCADDBUT

#1 Post by Eugene Lutsenko »

Prompt how to make, please, an inscription over the DCBROWSE window with data which are formed by a call of the function which has been set in DCADDBUTTON:

Image

Code: Select all

/* ----- Create ToolBar ----- */

@ 28.5, 0 DCTOOLBAR oToolBar SIZE 133, 1.5

K=4.15
DCADDBUTTON CAPTION 'Помощь'                       ;
   SIZE K+LEN("Помощь")                            ;
   ACTION {||Help4_2_1(), DC_GetRefresh(GetList)}  ;
   PARENT oToolBar                                 ;
   TOOLTIP 'Помощь по режиму 4.2.1'

DCADDBUTTON CAPTION Ar_Model[1]                    ;
   SIZE K+LEN(Ar_Model[1])                         ;
   ACTION {||InfPortCls1(), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[1]
DCADDBUTTON CAPTION Ar_Model[2]                    ;
   SIZE K+LEN(Ar_Model[2])                         ;
   ACTION {||InfPortCls2(), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[2]
DCADDBUTTON CAPTION Ar_Model[3]                    ;
   SIZE K+LEN(Ar_Model[3])                         ;
   ACTION {||InfPortCls3(), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[3]
DCADDBUTTON CAPTION Ar_Model[4]                    ;
   SIZE K+LEN(Ar_Model[4])                         ;
   ACTION {||InfPortCls4(), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[4]
DCADDBUTTON CAPTION Ar_Model[5]                    ;
   SIZE K+LEN(Ar_Model[5])                         ;
   ACTION {||InfPortCls5(), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[5]
DCADDBUTTON CAPTION Ar_Model[6]                    ;
   SIZE K+LEN(Ar_Model[6])                         ;
   ACTION {||InfPortCls6(), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[6]
DCADDBUTTON CAPTION Ar_Model[7]                    ;
   SIZE K+LEN(Ar_Model[7])                         ;
   ACTION {||InfPortCls7(), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[7]
DCADDBUTTON CAPTION Ar_Model[8]                    ;
   SIZE K+LEN(Ar_Model[8])                         ;
   ACTION {||InfPortCls8(), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[8]
DCADDBUTTON CAPTION Ar_Model[9]                    ;
   SIZE K+LEN(Ar_Model[9])                         ;
   ACTION {||InfPortCls9(), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[9]
DCADDBUTTON CAPTION Ar_Model[10]                   ;
   SIZE K+LEN(Ar_Model[10])                        ;
   ACTION {||InfPortCls10(), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[10]

DCADDBUTTON CAPTION 'MS Excel'                     ;
   SIZE K+LEN("MS Excel")                          ;
   ACTION {||Help4_2_1(), DC_GetRefresh(GetList)}  ;
   PARENT oToolBar                                 ;
   TOOLTIP 'Экспорт инф.портрета в MS Excel'

DCADDBUTTON CAPTION 'MS Word'                      ;
   SIZE K+LEN("MS Word")                           ;
   ACTION {||Help4_2_1(), DC_GetRefresh(GetList)}  ;
   PARENT oToolBar                                 ;
   TOOLTIP 'Экспорт инф.портрета в MS Word'

DCADDBUTTON CAPTION 'МультиРежим'                  ;
   SIZE K+LEN("МультиРежим")                       ;
   ACTION {||Help4_2_1(), DC_GetRefresh(GetList)}  ;
   PARENT oToolBar                                 ;
   TOOLTIP 'Задание на формирование и формирование инф.портретов'

@ 1,51 DCSAY MessIPC

/* ----- Create browse Classes ----- */

@ 2, 0 DCBROWSE oBrowse ALIAS 'Classes' SIZE 48.8,26   ;
       PRESENTATION aPres                             ;

DCBROWSECOL FIELD Classes->Kod_cls  HEADER "Код"                 PARENT oBrowse WIDTH 5 
DCBROWSECOL FIELD Classes->Name_cls HEADER "Наименование класса" PARENT oBrowse WIDTH 23
DCBROWSECOL FIELD Classes->Int_inf  HEADER "Редукция класса"     PARENT oBrowse WIDTH 3 
DCBROWSECOL FIELD Classes->Abs      HEADER "N объектов (абс.)"   PARENT oBrowse WIDTH 3 
DCBROWSECOL FIELD Classes->Perc_fiz HEADER "N объектов (%)"      PARENT oBrowse WIDTH 3 

/* ----- Create browse InfPortCls ----- */

PRIVATE bColorBlockZn:={|| iif(InfPortCls->Znach>0,{GRA_CLR_RED,nil},iif(InfPortCls->Znach=0,{GRA_CLR_BLACK,nil},{GRA_CLR_BLUE,nil})) }  // Клиффорд

@ 2,51 DCBROWSE oBrowIpc ALIAS 'InfPortCls' SIZE 82,26 ;
       PRESENTATION aPres                                       ;

DCSETPARENT oBrowIpc
   DCBROWSECOL FIELD InfPortCls->KOD_pr HEADER 'Код'                   WIDTH 5
   DCBROWSECOL FIELD InfPortCls->NAME   HEADER 'Наименование признака' WIDTH 37
   DCBROWSECOL DATA {|x|x:=InfPortCls->Znach,IIF(Empty(x),'',Str(x,8,3))} HEADER "Значимость" FONT "9.Courier" COLOR bColorBlockZn

DCGETOPTIONS TABSTOP

DCREAD GUI ;
   OPTIONS GetOptions ;
   MODAL ;
   TITLE MessIPC;
   FIT ;
   CLEAREVENTS

CLOSE ALL
DIRCHANGE(Disk_dir)   // Перейти в папку с исполнимым модулем системы

ReTURN nil
***********************************************************************************************************************

********************
FUNCTION Help4_2_1()
ReTURN nil
********************

******** Определение типа модели и обращение к функции с параметром, работающей со всеми моделями
FUNCTION InfPortCls1()
   InfPortCls(1)
ReTURN nil
FUNCTION InfPortCls2()
   InfPortCls(2)
ReTURN nil
FUNCTION InfPortCls3()
   InfPortCls(3)
ReTURN nil
FUNCTION InfPortCls4()
   InfPortCls(4)
ReTURN nil
FUNCTION InfPortCls5()
   InfPortCls(5)
ReTURN nil
FUNCTION InfPortCls6()
   InfPortCls(6)
ReTURN nil
FUNCTION InfPortCls7()
   InfPortCls(7)
ReTURN nil
FUNCTION InfPortCls8()
   InfPortCls(8)
ReTURN nil
FUNCTION InfPortCls9()
   InfPortCls(9)
ReTURN nil
FUNCTION InfPortCls10()
   InfPortCls(10)
ReTURN nil

******** Генерация информационного портрета в модели: Ar_Model[M_CurrInf]
******** для класса, на котором стоит курсор в БД Classes.dbf
FUNCTION InfPortCls(M_CurrInf)

SELECT Classes
M_Recno   = RECNO()
M_KodCls  = Kod_cls
M_NameCls = Name_cls

PUBLIC MessIPC := 'Класс: '+ALLTRIM(STR(M_KodCls, 15))+' "'+ALLTRIM(M_NameCls)+'". Модель: '+ALLTRIM(STR(M_CurrInf, 15))+' "'+Ar_Model[M_CurrInf]
*MsgBox(MessIPC)

SELECT (Ar_Model[M_CurrInf])
INDEX ON STR(9999999999.9999999-FIELDGET(2+M_KodCls),19, 7) TO (Ar_Model[M_CurrInf])
*            123456789012345678
*            12345678901.123456
*                     10       19

// Заполнить БД InfPortCls записями с кодами и наименованиями признаков и их значимостью
// взяв из (Ar_Model[M_CurrInf]) поровну записей с начала и с конца, но не более 13

SELECT InfPortCls;ZAP
SELECT (Ar_Model[M_CurrInf])
N_Gos = RECCOUNT()
N_pr  = IF(N_Gos/2 <= 7, N_Gos/2, 7)

// Сначала скопировать все записи в отсортированном порядке,
// а потом, если N_Gos > 2*N_pr, удалить столько наименее значимых, чтобы осталось 2*N_pr

DBGOTOP()
N = 0
DO WHILE .NOT. EOF()
   M_KodPr = Kod_pr
   M_Name  = Name
   M_Znach = FIELDGET(2+M_KodCls)
   IF M_KodPr > 0 .AND. M_Znach <> 0
      SELECT InfPortCls
      APPEND BLANK
      REPLACE Kod_pr WITH M_KodPr
      REPLACE Name   WITH M_Name
      REPLACE Znach  WITH M_Znach
   ENDIF
   ++N
   SELECT (Ar_Model[M_CurrInf])
   DBSKIP(1)
ENDDO

IF N_Gos > 2*N_pr
   N_del = N_Gos-2*N_pr
   // Удалить N_del наименее значимых записей
   SELECT InfPortCls
   INDEX ON STR(ABS(Znach),19, 7) TO (Ar_Model[M_CurrInf]+"z")
   DBGOTOP()
   N = 0
   DO WHILE .NOT. EOF() .AND. N <= N_Del
      DELETE
      ++N
      DBSKIP(1)
   ENDDO
   PACK
ENDIF

SELECT InfPortCls
DBGOTOP()

ReTURN(MessIPC)


Wolfgang Ciriack
Posts: 479
Joined: Wed Jan 27, 2010 10:25 pm
Location: Berlin Germany

Re: Inscription over the DCBROWSE window with data from DCAD

#2 Post by Wolfgang Ciriack »

Hello,
put the DCSAY in a Codeblock, give it an object identifier and do a dc_getrefresh(objectname), f.e.

Code: Select all

@ 1,51 DCSAY {|| MessIPC } OBJECT oSay1 SAYSIZE 0
if MessIPC is changed, then do a dc_getrefresh(oSay1)
_______________________
Best Regards
Wolfgang

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Inscription over the DCBROWSE window with data from DCAD

#3 Post by Eugene Lutsenko »

Thank you very much! Everything well works. If so will go further, there can be soon I will start something to understand... I already have a vague feeling that I already understand something a little

skiman
Posts: 1185
Joined: Thu Jan 28, 2010 1:22 am
Location: Sijsele, Belgium
Contact:

Re: Inscription over the DCBROWSE window with data from DCAD

#4 Post by skiman »

Hi,

Why are you doing the following?

Code: Select all

DCADDBUTTON CAPTION Ar_Model[1]                    ;
   SIZE K+LEN(Ar_Model[1])                         ;
   ACTION {||InfPortCls1(), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[1]
Instead of infportscls1() you can use infportscls(1).

This way you don't need the separate functions infportscls1...9.
Best regards,

Chris.
www.aboservice.be

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Inscription over the DCBROWSE window with data from DCAD

#5 Post by Eugene Lutsenko »

Before I something didn't guess. But I made something very similar, that you wrote, only in a cycle with an index, and it didn't work. And then made as shown higher at a forum. But now I certainly altered, as you prompted, and everything perfectly works. Where but will get to. Thanks!

Image

Finally it turned out so:

Code: Select all

/* ----- Create ToolBar ----- */

@ 28.5, 0 DCTOOLBAR oToolBar SIZE 133, 1.5

K=3.0
DCADDBUTTON CAPTION 'Помощь'                       ;
   SIZE K+LEN("Помощь")                            ;
   ACTION {||Help4_2_1(), DC_GetRefresh(GetList)}  ;
   PARENT oToolBar                                 ;
   TOOLTIP 'Помощь по режиму 4.2.1'

DCADDBUTTON CAPTION Ar_Model[1]                    ;
   SIZE K+LEN(Ar_Model[1])                         ;
   ACTION {||InfPortCls(1), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[1]
DCADDBUTTON CAPTION Ar_Model[2]                    ;
   SIZE K+LEN(Ar_Model[2])                         ;
   ACTION {||InfPortCls(2), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[2]
DCADDBUTTON CAPTION Ar_Model[3]                    ;
   SIZE K+LEN(Ar_Model[3])                         ;
   ACTION {||InfPortCls(3), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[3]
DCADDBUTTON CAPTION Ar_Model[4]                    ;
   SIZE K+LEN(Ar_Model[4])                         ;
   ACTION {||InfPortCls(4), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[4]
DCADDBUTTON CAPTION Ar_Model[5]                    ;
   SIZE K+LEN(Ar_Model[5])                         ;
   ACTION {||InfPortCls(5), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[5]
DCADDBUTTON CAPTION Ar_Model[6]                    ;
   SIZE K+LEN(Ar_Model[6])                         ;
   ACTION {||InfPortCls(6), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[6]
DCADDBUTTON CAPTION Ar_Model[7]                    ;
   SIZE K+LEN(Ar_Model[7])                         ;
   ACTION {||InfPortCls(7), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[7]
DCADDBUTTON CAPTION Ar_Model[8]                    ;
   SIZE K+LEN(Ar_Model[8])                         ;
   ACTION {||InfPortCls(8), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[8]
DCADDBUTTON CAPTION Ar_Model[9]                    ;
   SIZE K+LEN(Ar_Model[9])                         ;
   ACTION {||InfPortCls(9), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[9]
DCADDBUTTON CAPTION Ar_Model[10]                   ;
   SIZE K+LEN(Ar_Model[10])                        ;
   ACTION {||InfPortCls(10), DC_GetRefresh(GetList)};
   PARENT oToolBar                                 ;
   TOOLTIP 'Генерация информационного портрета в модели: '+Ar_Model[10]

DCADDBUTTON CAPTION 'MS Excel'                     ;
   SIZE K+LEN("MS Excel")                          ;
   ACTION {||Help4_2_1(), DC_GetRefresh(GetList)}  ;
   PARENT oToolBar                                 ;
   TOOLTIP 'Экспорт инф.портрета в MS Excel'

DCADDBUTTON CAPTION 'MS Word'                      ;
   SIZE K+LEN("MS Word")                           ;
   ACTION {||Help4_2_1(), DC_GetRefresh(GetList)}  ;
   PARENT oToolBar                                 ;
   TOOLTIP 'Экспорт инф.портрета в MS Word'

DCADDBUTTON CAPTION 'Фильтр по фактору'            ;
   SIZE K+LEN("Фильтр по фактору")                 ;
   ACTION {||Help4_2_1(), DC_GetRefresh(GetList)}  ;
   PARENT oToolBar                                 ;
   TOOLTIP 'Фильтр по фактору'

DCADDBUTTON CAPTION 'МультиРежим'                  ;
   SIZE K+LEN("МультиРежим")                       ;
   ACTION {||Help4_2_1(), DC_GetRefresh(GetList)}  ;
   PARENT oToolBar                                 ;
   TOOLTIP 'Задание на формирование и формирование инф.портретов'

mCheckWind = .T.
@ 0.7,0 DCCHECKBOX mCheckWind PROMPT 'Вписать инф.портрет класса в окно?'

@ 1,51 DCSAY {|| MessIPC } OBJECT oSay1 SAYSIZE 80 FONT "9.HelvBold"

/* ----- Create browse Classes ----- */

@ 2, 0 DCBROWSE oBrowse ALIAS 'Classes' SIZE 48.8,26   ;
       PRESENTATION aPres                             ;

DCBROWSECOL FIELD Classes->Kod_cls  HEADER "Код"                 PARENT oBrowse WIDTH 5 
DCBROWSECOL FIELD Classes->Name_cls HEADER "Наименование класса" PARENT oBrowse WIDTH 23
DCBROWSECOL FIELD Classes->Int_inf  HEADER "Редукция класса"     PARENT oBrowse WIDTH 3 
DCBROWSECOL FIELD Classes->Abs      HEADER "N объектов (абс.)"   PARENT oBrowse WIDTH 3 
DCBROWSECOL FIELD Classes->Perc_fiz HEADER "N объектов (%)"      PARENT oBrowse WIDTH 3 

/* ----- Create browse InfPortCls ----- */

PRIVATE bColorBlockZn:={|| iif(InfPortCls->Znach>0,{GRA_CLR_RED,nil},iif(InfPortCls->Znach=0,{GRA_CLR_BLACK,nil},{GRA_CLR_BLUE,nil})) }  // Клиффорд

@ 2,51 DCBROWSE oBrowIpc ALIAS 'InfPortCls' SIZE 82,26 ;
       PRESENTATION aPres                                       ;

DCSETPARENT oBrowIpc
   DCBROWSECOL FIELD InfPortCls->KOD_pr HEADER 'Код'                   WIDTH 5
   DCBROWSECOL FIELD InfPortCls->NAME   HEADER 'Наименование признака' WIDTH 37
   DCBROWSECOL DATA {|x|x:=InfPortCls->Znach,IIF(Empty(x),'',Str(x,8,3))} HEADER "Значимость" FONT "9.Courier" COLOR bColorBlockZn

DCGETOPTIONS TABSTOP

DCREAD GUI ;
   OPTIONS GetOptions ;
   MODAL ;
   TITLE '4.2.1. Информационные портреты классов';
   FIT ;
   CLEAREVENTS

CLOSE ALL
DIRCHANGE(Disk_dir)   // Перейти в папку с исполнимым модулем системы

ReTURN nil
***********************************************************************************************************************

********************
FUNCTION Help4_2_1()
LOCAL GetList[0], cText

TEXT INTO cText WRAP "\n" TRIMMED
Информационный портрет класса - это список факторов, ранжированных в порядке убывания силы их влияния на 
переход объекта управления в состояние, соответствующее данному классу. Информационный портрет класса от-
ражает систему его детерминации. Генерация информационного портрета класса представляет собой решение об-
ратной задачи прогнозирования, т.к. при прогнозировании по системе факторов определяется спектр наиболее 
вероятных будущих состояний объекта управления, в которые он может перейти под влиянием данной системы 
факторов, а в информационном портрете мы наоборот, по заданному будущему состоянию объекта управления оп-
ределяем систему факторов, детерминирующих это состояние, т.е. вызывающих переход объекта управления в 
это состояние. В начале информационного портрета класса идут факторы, оказывающие положительное влияние 
на переход объекта управления в заданное состояние, затем факторы, не оказывающие на это существенного 
влияния, и далее - факторы, препятствующие переходу объекта управления в это состояние (в порядке возрас-
тания силы препятствования). Силу и направление влияния значения фактора на поведение объекта управления 
будем называть значимостью этого значения. В различных статистических моделях и моделях знаний, применяе-
мых в системе "Эйдос-Х++", используются различны частные критерии знаний.
Полные наименования стат.моделей и моделей знаний, отличающихся видом частных критериев:
1. ABS  - частный критерий: количество встреч сочетаний: "класс-признак" у объектов обуч.выборки.
2. PRC1 - частный критерий: усл. вероятность i-го признака среди признаков объектов j-го класса.
3. PRC2 - частный критерий: условная вероятность i-го признака у объектов j-го класса.
4. INF1 - частный критерий: количество знаний по А.Харкевичу; вероятности из PRC1.
5. INF2 - частный критерий: количество знаний по А.Харкевичу; вероятности из PRC2.
6. INF3 - частный критерий: Xи-квадрат, разности между фактическими и ожидаемыми абс.частотами.
7. INF4 - частный критерий: ROI (Return On Investment); вероятности из PRC1.
8. INF5 - частный критерий: ROI (Return On Investment); вероятности из PRC2.
9. INF6 - частный критерий: разн.усл.и безусл.вероятностей; вероятности из PRC1.
10.INF7 - частный критерий: разн.усл.и безусл.вероятностей; вероятности из PRC2.
Информационные портреты классов могут быть от отфильтрованы по одной из описательных шкал, т.е. по одному 
из факторов. В этом случае информационный портрет будет отражать влияние на переход объекта управления в 
состояние, соответствующее классу, не всех отраженных в модели факторов, а значений (т.е. градаций описа-
тельных шкал или признаков) одного из них. Выбор класса осуществляется установкой курсора на записи с 
нужным классом в левом окне. Выбор стат.модели или модели знаний осуществляется нажатием соответствующей 
кнопки внизу окна.
ENDTEXT

@ 0,0 DCSTATIC TYPE XBPSTATIC_TYPE_TEXT SIZE 0 ;
     CAPTION cText FORMATTED ;
     FONT '10.Lucida Console' ;
     COLOR GRA_CLR_BLACK, GRA_CLR_WHITE

DCREAD GUI FIT TITLE 'Помощь по режиму: "4.2.1. Информационные портреты классов"'

ReTURN nil


ReTURN nil
********************

******** Генерация информационного портрета в модели: Ar_Model[M_CurrInf]
******** для класса, на котором стоит курсор в БД Classes.dbf
FUNCTION InfPortCls(M_CurrInf)

LOCAL Getlist := {}, oProgress, oDialog

SELECT Classes
M_Recno   = RECNO()
M_KodCls  = Kod_cls
M_NameCls = Name_cls

PUBLIC MessIPC := 'Инф.портрет класса: '+ALLTRIM(STR(M_KodCls, 15))+' "'+ALLTRIM(M_NameCls)+'" в модели: '+ALLTRIM(STR(M_CurrInf, 15))+' "'+UPPER(Ar_Model[M_CurrInf]+'"')
*MsgBox(MessIPC)
DC_GetRefresh(oSay1)

@ 4,5 DCPROGRESS oProgress SIZE 70,1.1 MAXCOUNT RecCount() COLOR GRA_CLR_RED PERCENT EVERY 100
DCREAD GUI TITLE 'Формирование информационного портрета класса' PARENT @oDialog FIT EXIT
oDialog:show()

SELECT (Ar_Model[M_CurrInf])
INDEX ON STR(9999999999.9999999-FIELDGET(2+M_KodCls),19, 7) TO (Ar_Model[M_CurrInf])
*            123456789012345678
*            12345678901.123456
*                     10       19

// Заполнить БД InfPortCls записями с кодами и наименованиями признаков и их значимостью
// взяв из (Ar_Model[M_CurrInf]) поровну записей с начала и с конца, но не более 13

SELECT InfPortCls;ZAP
SELECT (Ar_Model[M_CurrInf])
nMax = RECCOUNT()

// Сначала скопировать все записи в отсортированном порядке,
// а потом, если N_Gos > 2*N_pr, удалить столько наименее значимых, чтобы осталось 2*N_pr

DC_GetProgress(oProgress,0,nMax)
DBGOTOP()
DO WHILE .NOT. EOF()
   M_KodPr = Kod_pr
   M_Name  = Name
   M_Znach = FIELDGET(2+M_KodCls)
   IF M_KodPr > 0 .AND. M_Znach <> 0
      SELECT InfPortCls
      APPEND BLANK
      REPLACE Kod_pr WITH M_KodPr
      REPLACE Name   WITH M_Name
      REPLACE Znach  WITH M_Znach
   ENDIF
   DC_GetProgress(oProgress, RecNo(), nMax)
   SELECT (Ar_Model[M_CurrInf])
   DBSKIP(1)
ENDDO
DC_GetProgress(oProgress,nMax,nMax)

// Вписать инф.портрет класса в окно
IF mCheckWind

   SELECT InfPortCls
   N_Gos = RECCOUNT()
   N_pr  = IF(N_Gos/2 <= 11, N_Gos/2, 11)
   N_del = N_Gos-2*N_pr

   *MsgBox(STR(N_Gos,15)+STR(2*N_pr,15)+STR(N_del,15))

   IF N_del > 0
      // Удалить N_del наименее значимых записей
      SELECT InfPortCls
      INDEX ON STR(ABS(Znach),19, 7) TO (Ar_Model[M_CurrInf]+"z")
      DBGOTOP()
      N = 0
      DO WHILE .NOT. EOF() .AND. (N+1) <= N_Del
         DELETE
         ++N
         DBSKIP(1)
      ENDDO
      PACK
   ENDIF
ENDIF

oDialog:Destroy()

SELECT InfPortCls
SET ORDER TO
DBGOTOP()

ReTURN(MessIPC)

skiman
Posts: 1185
Joined: Thu Jan 28, 2010 1:22 am
Location: Sijsele, Belgium
Contact:

Re: Inscription over the DCBROWSE window with data from DCAD

#6 Post by skiman »

Hi,

Use aliasnames to make your code readable.

Code: Select all

   IF M_KodPr > 0 .AND. M_Znach <> 0
      SELECT InfPortCls
      APPEND BLANK
      REPLACE Kod_pr WITH M_KodPr
      REPLACE Name   WITH M_Name
      REPLACE Znach  WITH M_Znach
   ENDIF
   DC_GetProgress(oProgress, RecNo(), nMax)
   SELECT (Ar_Model[M_CurrInf])
   DBSKIP(1)
ENDDO
DC_GetProgress(oProgress,nMax,nMax)

// Вписать инф.портрет класса в окно
IF mCheckWind

   SELECT InfPortCls
   N_Gos = RECCOUNT()
Replace this with something like:

Code: Select all

   IF M_KodPr > 0 .AND. M_Znach <> 0
      InfPortCls->(dbappend())
      InfPortCls->Kod_pr := M_KodPr
      InfPortCls->Name := M_Name
      InfPortCls->Znach := M_Znach
   ENDIF
   DC_GetProgress(oProgress, (Ar_Model[M_CurrInf])->(RecNo()), nMax)    // your progress bar can't work correctly, because recno() 
                                                                //  is in the alias infportcls !!!

   (Ar_Model[M_CurrInf])->(DBSKIP(1))
ENDDO
DC_GetProgress(oProgress,nMax,nMax)

// Вписать инф.портрет класса в окно
IF mCheckWind

   N_Gos = InfPortCls->(RECCOUNT())
...
This way you don't need to SELECT every time. It is also much readable, now you can see in the code in which alias you do a skip, reccount, ...
Best regards,

Chris.
www.aboservice.be

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Inscription over the DCBROWSE window with data from DCAD

#7 Post by Eugene Lutsenko »

Thanks for the indication of a mistake with use of DC_GetProgress and for remarks on convenience of readership of a code which I with gratitude will use further. Certainly, I already got used to both styles of the appeal to fields of databases, and with SELECT switching (it is historically more habitual for me), and with the direct indication of a database: InfPortCls->Kod_pr: = M_KodPr. Therefore for me the main argument in favor of the second option is lack of need of additional switchings of the current base of data.

Here another (similar given) the program made taking into account your recommendations. This style was pleasant to me. It turns out more compactly and more clearly, both, in my opinion, somehow more naturally and, maybe, and will quicker work and to accumulate problems in stacks less.

Code: Select all

******** Генерация информационного портрета признака в модели: Ar_Model[M_CurrInf]
******** для признака, на котором стоит курсор в БД Inf.dbf
FUNCTION InfPortAtr(M_CurrInf)

LOCAL Getlist := {}, oProgress, oDialog

SELECT Inf
M_Recno  = RECNO()
M_KodPr  = Kod_pr
M_NamePr = Name

PUBLIC MessIPA := 'Инф.портрет признака: '+ALLTRIM(STR(M_KodPr, 15))+' "'+ALLTRIM(M_NamePr)+'" в модели: '+ALLTRIM(STR(M_CurrInf, 15))+' "'+UPPER(Ar_Model[M_CurrInf]+'"')
*MsgBox(MessIPA)
DC_GetRefresh(oSay1)

@ 4,5 DCPROGRESS oProgress SIZE 70,1.1 MAXCOUNT RecCount() COLOR GRA_CLR_RED PERCENT EVERY 100
DCREAD GUI TITLE 'Формирование информационного портрета признака' PARENT @oDialog FIT EXIT
oDialog:show()

SELECT InfPortPr;ZAP               // Точно такая же БД, как InfPortAtr, временная для выборки данных из Inf# и сортировки
SELECT (Ar_Model[M_CurrInf])       // Модель для выборки данных
DBGOTO(M_Recno)                    // Выход на строку с информацией по заданному признаку
FOR j=1 TO N_Cls
    M_Znach = FIELDGET(2+j)
    IF M_Znach <> 0
       InfPortPr->(DBAPPEND())
       InfPortPr->Kod_cls := j
       Classes->(DBGOTO(j))
       InfPortPr->Name    := Classes->Name_cls
       InfPortPr->Znach   := M_Znach
    ENDIF
NEXT

// Заполнить БД InfPortAtr записями с кодами и наименованиями признаков и их значимостью
// взяв из InfPortPr отсортированнеы по значимости данные

SELECT InfPortAtr;ZAP
SELECT InfPortPr
INDEX ON STR(9999999999.9999999-Znach,19, 7) TO (Ar_Model[M_CurrInf])
*            123456789012345678
*            12345678901.123456
*                     10       19
nMax = RECCOUNT()

// Сначала скопировать все записи в отсортированном порядке,
// а потом, если N_Rec > 2*N_Str, удалить столько наименее значимых, чтобы осталось 2*N_Str

DC_GetProgress(oProgress,0,nMax)
DBGOTOP()
DO WHILE .NOT. EOF()
   InfPortAtr->(DBAPPEND())
   InfPortAtr->Kod_cls := InfPortPr->Kod_cls
   InfPortAtr->Name    := InfPortPr->Name
   InfPortAtr->Znach   := InfPortPr->Znach
   DC_GetProgress(oProgress, RecNo(), nMax)
   DBSKIP(1)
ENDDO
DC_GetProgress(oProgress,nMax,nMax)

// Вписать инф.портрет признака в окно
IF mCheckWind

   SELECT InfPortAtr
   N_Rec = RECCOUNT()
   N_Str  = IF(N_Rec/2 <= 11, N_Rec/2, 11)
   N_Del = N_Rec-2*N_Str

   *MsgBox(STR(N_Rec,15)+STR(2*N_Str,15)+STR(N_Del,15))

   IF N_Del > 0
      // Удалить N_del наименее значимых записей
      SELECT InfPortAtr
      INDEX ON STR(ABS(Znach),19, 7) TO (Ar_Model[M_CurrInf]+"z")
      DBGOTOP()
      N = 0
      DO WHILE .NOT. EOF() .AND. (N+1) <= N_Del
         DELETE
         ++N
         DBSKIP(1)
      ENDDO
      PACK
   ENDIF
ENDIF

oDialog:Destroy()

SELECT InfPortAtr
SET ORDER TO
DBGOTOP()

ReTURN NIL
Last edited by Eugene Lutsenko on Thu Aug 23, 2012 6:02 am, edited 1 time in total.

Cliff Wiernik
Posts: 605
Joined: Thu Jan 28, 2010 9:11 pm
Location: Steven Point, Wisconsin USA
Contact:

Re: Inscription over the DCBROWSE window with data from DCAD

#8 Post by Cliff Wiernik »

Another reason to always alias all references to database variables in windows is because of the nature of windows, especially when using tabpages, and multiple dialogs. I have found out that sometimes a dialog is displayed and a field in a codeblock updated prior to the select clause in a gotfocus statement of dctabpage getting executed. Thus, the proper workarea was not yet active, causing a runtime error. With aliases always being used, this is not longer a problem in addition to being more readable.

Cliff.

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Inscription over the DCBROWSE window with data from DCAD

#9 Post by Eugene Lutsenko »

Hello, Clifford!

It is one more very serious argument in favor of use of pseudonyms. It is not necessary to watch what base current or, at least, is easier to watch. I will use.

skiman
Posts: 1185
Joined: Thu Jan 28, 2010 1:22 am
Location: Sijsele, Belgium
Contact:

Re: Inscription over the DCBROWSE window with data from DCAD

#10 Post by skiman »

Hi,

In your new code you still have a lot of
dbskip(), reccount(), delete, ... without alias. You still could optimize it a lot.

Replace commands as DELETE with dbdelete().
Best regards,

Chris.
www.aboservice.be

Post Reply