Форум » [x]Harbour » Функция CEILING (округление по верхнему пределу) » Ответить

Функция CEILING (округление по верхнему пределу)

Dr. Oldwarez: Согласно документации в Харборе есть функция CEILING - функция округления по верхнему пределу. Но почему-то, когда я пытаюсь её использовать, программа выдаёт ошибку: "Нет такой функции". Подскажите, что не так. Может дополнительный модуль какой-то залинковать надо и для этого COMPILE.BAT изменить?

Ответов - 10

Pasha: Это же функция tools А вообще загляни в эту тему: http://clipper.borda.ru/?1-4-0-00000255-000-0-0

Dr. Oldwarez: Pasha пишет: Это же функция tools А вообще загляни в эту тему: http://clipper.borda.ru/?1-4-0-00000255-000-0-0 Да, я знаю, что это функция tools (hbct.lib). А как залинковать все функции tools в EXE-файл? У меня в COMPILE.BAT она прописана.

Pasha: Dr. Oldwarez пишет: А как залинковать все функции tools в EXE-файл? С помощью команды external, или ее тезки request, вестимо.


Петр: Pasha пишет: С помощью команды external, или ее тезки request, вестимо. Так и есть, вот хотя бы так [pre2] #define __HBEXTREQ__ 1 #define __HBEXTERN__HBCT__REQUEST 1 #include "hbct.hbx" PROCEDURE main( ... ) cStr := 'Ceiling' ? &cStr.( 2.00001 ) RETURN [/pre2]

Dr. Oldwarez: Открываю страшную тайну: эта функция должна вызываться в генераторе отчётов FastReport, через CallHBFunc. И тут этот фокус с &cStr не проходит.

Петр: Dr. Oldwarez пишет: А как залинковать все функции tools в EXE-файл? Вариант решения #define __HBEXTREQ__ 1 #define __HBEXTERN__HBCT__REQUEST 1 #include "hbct.hbx" И тут этот фокус с &cStr не проходит Это всего лишь пример.

Andrey: Dr. Oldwarez пишет: эта функция должна вызываться в генераторе отчётов FastReport, через CallHBFunc. И тут этот фокус с &cStr не проходит. Опиши тогда эти (нужные тебе) функции явно для FastReport ! Порядок подключения: а) Нужна сама фунция (см. в тексте программы) // !!! - 1) Подключаемая функция xH&Fr !!! б) Подключение в FastReport - :SetEventHandler // !!! - 2) Подключаемая функция xH&Fr !!! в) Подключение в FastReport - :AddFunction // !!! - 3) Подключаемая функция xH&Fr !!! г) Подключение в функции CallUserFunction // !!! - 4) Подключаемая функция xH&Fr !!! Пример 2008 года /////////////////////////////////////////////////////////////////////////////// #include "FastRepH.ch" FUNCTION MyFR4(nShowDesignReport) LOCAL cFileForm, cPath PUBLIC myFirma, MyAdres, MyTelefon, MyViborka, MyNumba, MyLogoFirma, MyPathRes cFileForm := "bookabon.fr3" cPath := CurDrive() + ":\" + CurDir() + '\' M->myPathRes := CurDrive() + ":\" + CurDir() + '\' M->MyFirma := HB_OEMTOANSI('ООО "Рога и Копыта"') M->MyAdres := HB_OEMTOANSI('г.Москва, Набережная 13') M->MyTelefon := HB_OEMTOANSI('тел.: (495) 123-45-67') M->MyViborka := HB_OEMTOANSI('Дата договора: = 12.01.08 .....') M->MyNumba := 123456 M->MyLogoFirma := M->MyPathRes+"LogoFirma.jpg" // Вызов "моей" функции в FastReport'e // // ( имя формы ) , (1-ShowReport или 2-DesignReport) MyFastReport4( cPath + cFileForm , nShowDesignReport ) RETURN NIL //////////////////////////////////////////////////////////////// FUNCTION MyFastReport4(cFileForm, nShowDesignReport) LOCAL cTitle := HB_OEMTOANSI( "Печать формы: " ), cAvtor PRIVATE FrPrn //----------- Now load and init FastReport -------------------------------------- FrPrn := frReportManager():new() //---------- Set the same icon for FastReport windows---------- FrPrn:SetIcon( "FASTREP_ICO" ) //---------- Set the same title for FastReport taskBar-window FrPrn:SetTitle( cTitle + cFileForm ) //----------- Set to disable main window when FastReport executes---------------------- // FrPrn:SetVisualActions(FR_ACT_DISABLE); //----------- Определяет набор кнопок, которые будут доступны в Окне-Просмотра -------- FrPrn:PreviewOptions:SetButtons(FR_PB_PRINT + FR_PB_LOAD + FR_PB_SAVE + ; FR_PB_EXPORT + FR_PB_ZOOM + FR_PB_FIND + FR_PB_OUTLINE + FR_PB_PAGESETUP + ; FR_PB_TOOLS + FR_PB_EDIT + FR_PB_NAVIGATOR ) //----------- Устанавливает режим зума в Окне-Просмотра -------------- FrPrn:PreviewOptions:SetZoomMode(FR_ZM_WHOLEPAGE) //----------- Устанавливает/возвращает автора отчета ----------------- cAvtor := FrPrn:ReportOptions:SetAuthor() //----------- Load Lang resource for FastReport ---------------------- //FrPrn:LoadLangRes( M->myPathRes + "english.xml" ) //----------- Alias base and SELECT work area for FastReport ---------------------- FrPrn:SetWorkArea( ALIAS(), SELECT(), .T. ) // .T. для OEM-кодировки БД // обойдемся без средств FastReport'a //FrPrn:SetFieldAliases( "BookAbon", "CUSTNO=Cust No;Company;ADDR1=Address;Phone;Fax;Contact" ) //----------- Load file form FastReport ---------------------- FrPrn:LoadFromFile( cFileForm ) //-------- add XBase++ vars to FastReport --------------------- FrPrn:AddVariable( "My Lovely Vars", "MyPathRes", "'"+myPathRes+"'" ) FrPrn:AddVariable( "My Lovely Vars", "MyFirma" , "'"+MyFirma+"'" ) FrPrn:AddVariable( "My Lovely Vars", "MyAdres" , "'"+MyAdres+"'" ) FrPrn:AddVariable( "My Lovely Vars", "MyTelefon", "'"+MyTelefon+"'" ) FrPrn:AddVariable( "My Lovely Vars", "MyNumba" , MyNumba ) FrPrn:AddVariable( "My Lovely Vars", "MyLogoFirma", "'"+MyLogoFirma+"'" ) // !!! - 2) Подключаемая функция xH&Fr !!! // FrPrn:SetEventHandler( "Report", "OnUserFunction", { | FName, FParams | CallUserFunction( FName, FParams ) } ) FrPrn:AddFunction( "function XBaseStr(nValue: Double, nLength: Variant = EmptyVar, nDecimals: Variant = EmptyVar): Variant", ; "My Lovely Functions!", "It's a XBase Str() function!" ) // !!! - 3) Подключаемая функция xH&Fr !!! // FrPrn:AddFunction( "function Say_Sel_Dim(nKod: Variant; cAlias: String ; cPole: String; lAnsi: Boolean ): String", ; "My Lovely Functions!", "Samle: Say_Sel_Dim(<BASE.chr(34)+POLE+chr(34)>,'City','City',.T.)" ) // Подключаемая стандартная функция xHarbour // FrPrn:AddFunction( "function STR(nValue: Double, nLength: Variant = EmptyVar, nDecimals: Variant = EmptyVar): Variant", ; "[x]Harbour", "Sample: STR(999.99,3,2)" ) FrPrn:AddFunction( "function TRANSFORM(cPole: String; cPicture: String ): String", ; "[x]Harbour", "Sample: TRANSFORM(<BASE.chr(34)+POLE+chr(34)>,'@Z 9999')" ) FrPrn:AddFunction( "function ALLTRIM(cStroka: String ): String", ; "[x]Harbour", "Sample: ALLTRIM('Stroka ')" ) FrPrn:AddFunction( "function IIF(xPar1: Variant; xPar2: Variant ; xPar3: Variant): Variant", ; "[x]Harbour", "Sample: IIF(par1,par2,par2)" ) IF nShowDesignReport == 1 FrPrn:ShowReport() ELSE FrPrn:DesignReport() ENDIF FrPrn:ClearDataSets() //-------- Unload FastReport ------------------------------------------------------------- FrPrn:DestroyFR() RETURN NIL //////////////////////////////////////////////////////////////// FUNCTION CallUserFunction( FName, FParams ) LOCAL RES IF ( FName == "XBASESTR" ) RES := Str( FParams[ 1 ], FParams[ 2 ], FParams[ 3 ] ) // --------------- без этой строчки работать не будет ---// // !!! - 4) Подключаемая функция xH&Fr !!! // // --------------- без этой строчки работать не будет ---// ELSEIF ( FName == "SAY_SEL_DIM" ) RES := Say_Sel_Dim( FParams[ 1 ], FParams[ 2 ], FParams[ 3 ], FParams[ 4 ] ) // Подключаемая стандартная функция xHarbour // ELSEIF ( FName == "STR" ) RES := ALLTRIM( FParams[ 1 ], FParams[ 2 ], FParams[ 3 ] ) ELSEIF ( FName == "ALLTRIM" ) RES := ALLTRIM( FParams[ 1 ] ) ELSEIF ( FName == "TRANSFORM" ) RES := TRANSFORM( FParams[ 1 ], FParams[ 2 ] ) ELSEIF ( FName == "IIF" ) RES := IIF( FParams[ 1 ], FParams[ 2 ], FParams[ 3 ] ) ENDIF RETURN RES //////////////////////////////////////////////////////////////// // // !!! - 1) Подключаемая функция xH&Fr !!! // // #include "ord.ch" #include "common.ch" /************************************************************* * ВыбоР Элемента поля из базы по его коду в основной базе * ************************************************************* * 1-код поля, 2-имя базы, 3-наим.поля -> возврат его */ FUNCTION Say_Sel_Dim(nKod, NAME_dbf, cPOLE_KOD, lAnsiOem) LOCAL nun:=SELECT(), nRec:=RECNO(), xKod , nRet, cType DEFAULT lAnsiOem TO .F. // перевод строки OEM -> ANSI SELECT ( name_dbf ) nRet := FIELDNUM(ALLTRIM(cPOLE_KOD)) cType := FIELDTYPE(nRet) IF nRet == 0 xKod:= 'Нет поля "'+cPOLE_KOD+'" в БД "'+NAME_dbf+'" по алиасу "'+ALIAS()+'" !' IF lAnsiOem xKod := HB_OEMTOANSI(xKod) ENDIF ELSE name_ntx1 := DBORDERINFO(DBOI_INDEXNAME,, ALIAS(NAME_dbf) ) DBSETORDER(1) GOTO TOP SEEK nKod IF FOUND() xKod := FIELDGET(nRet) IF cType == "C" IF lAnsiOem xKod := HB_OEMTOANSI(xKod) ENDIF ENDIF ELSE xKod:= "нет данных" IF lAnsiOem xKod := HB_OEMTOANSI(xKod) ENDIF DO CASE CASE cType == "С" // Символьный xKod:="нет данных" IF lAnsiOem xKod := HB_OEMTOANSI(xKod) ENDIF CASE cType == "N" // Числовой xKod:= -1 CASE cType == "D" // Date xKod:=CTOD("00.00.00") CASE cType == "L" // Логический xKod:= "нет данных" CASE cType == "М" // Memo xKod:= "нет данных" IF lAnsiOem xKod := HB_OEMTOANSI(xKod) ENDIF ENDCASE ENDIF ENDIF SELECT( nun ) //DBGOTO( nRec ) RETURN xKod Вообще то CallHBFunc - очень капризная вещь ! Я добивался работы этой функции с трудом. Легче явно написать в коде нужную функцию. Быстрей будет получен результат. В свое время я Сергея Спирина просил включить все эти функции в FastReport. Он тогда писал, что каждый добавит, что пользователю нужно....

Dr. Oldwarez: Andrey пишет: Вообще то CallHBFunc - очень капризная вещь ! Я добивался работы этой функции с трудом. Легче явно написать в коде нужную функцию. Быстрей будет получен результат. Ну, я уже сто раз эту функцию использовал и ничего, причём использовал её для вызова сложнейших функций с запросом к другой таблице.

Dr. Oldwarez: Кончилось тем, что я... сам написал эту функцию (округление по максимуму до ближайшей десятки) [pre2]FUNCTION CEIL10(nNumber) LOCAL nRound:=ROUND(nNumber,-1) IF nRound<nNumber nRound:=nRound+10 ENDIF RETURN nRound[/pre2] Пример: входное значение 173,24 выходное 180

Петр: Dr. Oldwarez пишет: Кончилось тем, что я... сам написал эту функцию Мы легкого пути не ищем.. Т.е. вариант добавить в хотя бы в тот же FastRepH.prg, где-то между #include "FastRepH.ch" и EXTERNAL EVAL #define __HBEXTREQ__ 1 #define __HBEXTERN__HBCT__REQUEST 1 #include "hbct.hbx" если нужно _ВСЕ_ функции или просто EXTERNAL CEILING религия не позволяет. P.S. можно написать просто #define __HBEXTERN__HBCT__REQUEST #include "hbct.hbx"



полная версия страницы