Beheben von Problemen bei der Migration einer Anwendung unter ADS

Advantage Database Server

Moderator: Moderatoren

Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von Eugeny Lutsenko »

Hallo!

Ich fing an, zu lokalen ADS. Im Allgemeinen scheint es zu funktionieren, aber manchmal funktioniert das, was früher gut funktioniert hat, nicht mehr. Kann ich von Ihnen Unterstützung erhalten, um bestimmte Probleme bei der Migration einer App zu ADS zu lösen? Es geht um ein großes System: http://lc.kubagro.ru/aidos/index.htm, http://lc.kubagro.ru/aidos/_Aidos-X.htm
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von nightcrawler »

Eugeny,
hier sind viele unterwegs, die mit Xbase++ und ADS arbeiten. Ich bin weniger der Xbase++ Experte, kenne mich dafür aber sehr gut mit dem ADS aus. Wenn konkrete Fragen zum ADS auftauchen, versuche ich immer zu antworten (sofern nicht schon von anderen gute Lösungen genannt wurden).
Stelle einfach Deine Fragen hier herein und wir helfen Dir.

Auf der anderen Seite: ADS ist von SAP auf das Abstellgleis gestellt worden. Ich rechne nicht mehr mit neuen Versionen. Vielleicht wäre ein andere Produkt besser geeignet für eine Migration.
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von Eugeny Lutsenko »

nightcrawler!

Danke für die Antwort. Ich entwickle ein großes System in Alaska+Express in dbfntx. Für dbf gibt es ein starkes Limit für die Datenbankgröße von 2 GB. Es besteht die Notwendigkeit, diese Einschränkung aufzuheben. ADS ist die einzige Möglichkeit, dies mit minimalen Änderungen am Quellcode und damit dem Aufwand für Arbeit und Zeit zu tun. Mir wurde hier und im Roger-Forum geholfen. Es funktioniert gut. Ich zitiere unten ein Demo-Lehrprogramm zur Verwendung von ADS für die Arbeit mit sehr großen DBF-Dateien. Mit seiner Hilfe habe ich eine 400-GB-DBF-Datei erstellt und alles funktioniert darauf. Aber manchmal gibt es Nuancen, weil. etwas von dem, was früher gut funktionierte, wurde zu Ausführungsfehlern. Das ist es, was ich tun möchte. Ich verwende lokale ADS.

Code: Alles auswählen

/*
     *** (C) д.э.н., к.т.н., профессор Луценко Евгений Вениаминович, Россия, Краснодар.
     *** 4:57 27.01.2022.    Эксперименты с БД максимального размера с ADSDBE
*/
     ********************
     #include "adsdbe.ch"  // ADSDBE = ADS SERVER ENGINE
     ********************
     #include "dcdir.ch"
     #include "natmsg.ch"
     #include "appevent.ch"
     #include "xbp.ch"
     #include "dll.ch"
     #include "dccursor.ch"
     #Include "thread.ch"
     #include "class.ch"
     #include "dmlb.ch"
     #include "fileio.ch"
     #include "dctree.ch"
*    #include "SystemMetrics.ch"
*    #include "axcdxcmx.ch"  // Графика ActiveX
     #include "collat.ch"
     #include "common.ch"
     #include "dbedit.ch"
     #include "dbfdbe.ch"
     #include "dcapp.ch"
     #include "dcbitmap.ch"
     #include "dccargo.ch"
     #include "dcdialog.ch"
     #include "dcdir.ch"
     #include "dcfiles.ch"
     #include "dcgra.ch"
     #include "dcgraph.ch"        // графика
     #include "BdColors.Ch"       // графика
     #include "dccolors.ch"       // графика
     #include "dcprint.ch"        // графика
     #include "dcicon.ch"
     #include "dcmsg.ch"
     #include "dcpick.ch"
     #include "deldbe.ch"
     #include "dmlb.ch"
     #include "express.ch"
     #include "fileio.ch"
     #include "font.ch"
     #include "gra.ch"
     #include "inkey.ch"
     #include "memvar.ch"
     #include "prompt.ch"
     #include '_dcdbfil.ch'
     #include "set.ch"
     #include "std.ch"
     #include "xbp.ch"
     #include '_dcappe.ch'
     #include 'dcscope.ch'
     #include '_dcstru.ch'
     #include 'dcfields.ch'
     #include 'dccolor.ch'
     #include "Fileio.ch"    // Max_DB
     *#include "rmchart.ch"   // Графика ActiveX
     *#include "dcads.ch"
     
     #pragma library( "ascom10.lib" )
     #pragma library( "dclip1.lib" )
     #pragma library( "dclip2.lib" )
     #pragma library( "dclipx.lib" )
     #pragma library( "xbtbase1.lib" )
     #pragma library( "xbtbase2.lib" )
     #pragma library( "xppui2.lib" )
     #Pragma Library("Taskbar.lib")

     #include "directry.ch"                 // 2.0
     #pragma Library( "ASINet10.lib" )      // 2.0
     
     PROCEDURE AppSys
        // Рабочий стол остается окном приложения
     RETURN

     ***************************************************************************
     PROCEDURE DBESYS()  // Overload the default DBESYS for your required DBE   
     ***************************************************************************
     //----- FOXCDX: DBF-FPT-CDX                                                
       IF ! DbeLoad( "FOXDBE", .T.)     // load engine for DBF files            
          msgbox( "Database Engine FOXDBE not loaded" , "STOP" )                
          QUIT                                                                  
       ENDIF                                                                    
       IF ! DbeLoad( "CDXDBE", .T.)     // load engine for DBF files            
          msgbox( "Database Engine CDXDBE not loaded" , "STOP" )                
          QUIT                                                                  
       ENDIF                                                                    
       DbeBuild( "FOXCDX", "FOXDBE", "CDXDBE" )   // DBE=FOXCDX                 
       *** DbeSetDefault("FOXCDX")  // OFF                                      
                                                                                
     //----- DBFNTX: DBF-DBT-NTX                                                
     // ADS client engine and ALS Local Server engine exist                     
     // Overload the default DBESYS for your required DBE                       
     // system for working with DBF/NTX files on both server and client         
                                                                                
       IF ! DbeLoad( "DBFDBE")     // load engine for DBF files                 
          msgbox( "Database Engine DBFDBE not loaded" , "STOP" )                
          QUIT                                                                  
       ENDIF                                                                    
       IF ! DbeLoad( "NTXDBE")     // load engine for DBF files                 
          msgbox( "Database Engine NTXDBE not loaded" , "STOP" )                
          QUIT                                                                  
       ENDIF                                                                    
       DbeBuild( "DBFNTX", "DBFDBE", "NTXDBE" )   // DBE=DBFNTX                 
       *** DbeSetDefault("DBFNTX")  // OFF                                      
                                                                                
                                                                                
     //----- ADSDBE: DBF-DBT-NTX                                                
     // there must be ACE32.DLL otherwise it breaks here !!!                    
     // mora postojati ACE32.DLL inaиe ovde pukne !!!                           
     //-----------------------------------------------------                    
        IF ! DbeLoad( "ADSDBE", .F.)     // load engine for ADS                 
           msgbox( "Database Engine ADSDBE not loaded" , "STOP" )               
           QUIT                                                                 
        ENDIF                                                                   
                                                                                
        ***********************                                                 
        DbeSetDefault("ADSDBE")  // ON                                          
        ***********************                                                 
                                                                                
     RETURN                                                                     

     
     ********************************************************************************
     ********************************************************************************
     FUNCTION Main()
     
        LOCAL Getlist := {}, oProgress, oDialog
        LOCAL aSay[30], Mess97, Mess98, Mess99               // Массив сообщений отображаемых стадий исполнения (до 30 на экране)

        DC_IconDefault(1000)

        ADS_SERVER_START()

        SET DECIMALS TO 15
        SET DATE GERMAN
        SET ESCAPE On

        ********************************************************************

        mNField  = 10           // Максимум 2040
        mNRecord = 10           // Максимум 1000000000000

        @1,1  DCGROUP oGroup1 CAPTION 'Задайте параметры базы данных:' SIZE 40.0, 3.5

        @1,2  DCSAY "Количество полей:"                  PARENT oGroup1 
        @1,20 DCSAY "" GET mNField  PICTURE "##########" PARENT oGroup1 

        @2,2  DCSAY "Количество записей:"                PARENT oGroup1 
        @2,20 DCSAY "" GET mNRecord PICTURE "##########" PARENT oGroup1 

        DCREAD GUI;
              TO lExit ;
              FIT;
              ADDBUTTONS;
              MODAL;
              TITLE 'Эксперименты с ADS и PGDBU'
              IF lExit
                 ** Button Ok
              ELSE
                 QUIT
              ENDIF
        ********************************************************************

        Wsego = mNRecord
        
        // Отображение стадии исполнения. Будет написано прямо в окне Progress-bar
        d = 0
        @0,0 DCGROUP oGroup1 CAPTION 'Стадии исполнения процесса' FONT "6.Helv" SIZE 105+d, 2.5 PARENT oTabPage1
        @4,0 DCGROUP oGroup2 CAPTION 'Прогноз времени исполнения' FONT "6.Helv" SIZE 105+d, 5.0 PARENT oTabPage2
        
         s = 1
        @s++,1 DCSAY " " SAYSIZE 100 SAYOBJECT aSay[ 1] FONT "10.Helv"
         s++
        @s++,1 DCSAY " " SAYSIZE 100 SAYOBJECT oSay97   FONT "10.HelvBold"
         s++
        @0.2+s++,1 DCSAY " " SAYSIZE 100 SAYOBJECT oSay98 FONT "9.Helv Bold" COLOR GRA_CLR_BLUE
        @1.5+s  ,1 DCSAY " " SAYSIZE 100 SAYOBJECT oSay99 FONT "9.Helv Bold" COLOR GRA_CLR_BLUE
        
        @s  ,1 DCPROGRESS oProgress ;
               SIZE 95,1.5 ;
               PERCENT ;
               EVERY 1;                          // Кол-во обновлений изображения
               MAXCOUNT Wsego; 
               COLOR GRA_CLR_CYAN                // Цвет полосы
        @s++,97 DCPUSHBUTTON  CAPTION '&Cancel' ;
               ACTION {||lOk:=.T.} OBJECT oButton ;
               SIZE 7,1.5
        DCREAD GUI ;
               TITLE 'Создание базы данных "BigData.dbf"' ;
               PARENT @oDialog  ;
               FIT ;
               EXIT ;
               MODAL
        
        oDialog:alwaysOnTop = .T.       // Окно открывается на переднем плане
        oDialog:show()
        
        ****** Обработка ошибки ******************
        bError := ErrorBlock( {|e| Break(e)} )           // установить новый кодовый блок обработки ошибок
        BEGIN SEQUENCE                                   // код нормального исполнения
        
              *** код нормального исполнения
        
              aStructure := { { "NumbRecord"  , "N", 19, 0} }
              
              FOR j=1 TO mNField
                  FieldName = "F"+ALLTRIM(STR(j,19))
                  AADD(aStructure, { FieldName  , "N", 19, 7 })
              NEXT
              DbCreate( "BigData.dbf", aStructure )
        
        RECOVER                                          // код обработки ошибки
              aMess := {}
              AADD(aMess, "Возникла ошибка при попытке создания БД с числом полей: "+ALLTRIM(STR(mNField)))
              LB_Warning(aMess, 'Эксперименты с "BigData.dbf"')
              MsgBox('')
              ADS_SERVER_QUIT()
              QUIT
        ENDSEQUENCE 
        ErrorBlock( bError )                             // переустановить старый кодовый 
        ******************************************
        
        // Начало отсчета времени для прогнозирования длительности исполнения
        Time_progress = 0
        // Прошло секунд с начала процесса
        // Процесс может идти больше суток, поэтому для определения
        // во всех случаях вычисляется время, прошедшее с начала года
           T_Mess1    = "Начало:"+" "+TIME()            // Начало
           Sec_1      = (DOY(DATE())-1)*86400+SECONDS()
           PUBLIC T1 := (DOY(DATE())-1)*86400+SECONDS()        // Время предыдущей индикации процесса исполнения
           PUBLIC T2 := (DOY(DATE())-1)*86400+SECONDS()+1      // Текущее время (1-й раз оно заметно больше T1 чтобы было отображение)
           PUBLIC T1tp := T1
           PUBLIC T2tp := T2
        *********************************************************************************
        
        ****** Обработка ошибки ******************
        bError := ErrorBlock( {|e| Break(e)} )           // установить новый кодовый блок обработки ошибок
        BEGIN SEQUENCE                                   // код нормального исполнения
        
              *** код нормального исполнения
        
              aSay[ 1]:SetCaption('Идет процесс создания базы данных: "BigData.dbf"')
        
              USE BigData EXCLUSIVE NEW
        
              FOR r=1 TO mNRecord
        
                  APPEND BLANK
                  REPLACE NumbRecord WITH r
        
                  lOk = Time_Progress (++Time_Progress, mNRecord, oProgress, lOk )
        
              NEXT
        
        RECOVER                                          // код обработки ошибки
              CLOSE ALL
              aMess := {}
              AADD(aMess, "Возникла ошибка при попытке добавления в БД записи N=й: "+ALLTRIM(STR(r)))
              LB_Warning(aMess, 'Эксперименты с "BigData.dbf"')
              MsgBox('')
*             ADS_SERVER_QUIT()
*             QUIT
        ENDSEQUENCE 
        ErrorBlock( bError )                             // переустановить старый кодовый 
        ******************************************

        ADS_CopyFile('BigData.dbf', 'BigDdds.dbf', .T., .F.)

        ***** Удаление старых версий файла START_AIDOS запуска и обновления системы Эйдос, если они есть <<<===#######################
        
        CLoseAll()            // Закрытие всех баз данных с ожиданием завершения операций
        
*       aDir := Directory("*START_AIDOS-X*.exe")

        mNStartAidos = ADIR("*START_AIDOS-X*.exe")
        PRIVATE aFileName[mNStartAidos], aFileSize[mNStartAidos], aFileDate[mNStartAidos], aFileTime[mNStartAidos]
        ADIR("*START_AIDOS-X*.exe", aFileName, aFileSize, aFileDate, aFileTime)

*       LB_Warning(aFileName, 'Эксперименты с "BigData.dbf"')
        
        aStructure := { { 'File_Num ', "C",  8, 0 }, ;
                        { 'File_Name', "C", 40, 0 }, ;        // ___START_AIDOS-X_2021_10_26.exe
                        { 'File_Size', "N", 10, 0 }, ;
                        { 'File_Date', "D",  8, 0 }, ;
                        { 'File_Time', "C",  8, 0 }, ;
                        { 'Delete   ', "C",  1, 0 }  }
*       DbCreate( "StartAidos.dbf", aStructure, "DBFNTX" )   // ALL NB !!!
        DbCreate( "StartAidos", aStructure )                 // ALL NB !!!
        
*       USE ("StartAidos.dbf") NEW SHARED ALIAS "START_AIDOS"
        USE StartAidos EXCLUSIVE NEW
        
        IF LEN(aFileName) > 0

*          FOR j := 1 TO Len(aDir)
*              APPEND BLANK
*              REPLACE File_Num  WITH ALLTRIM(STR(j))
*              REPLACE File_Name WITH aDir[j,F_NAME]       
*              REPLACE File_Size WITH aDir[j,F_SIZE]       
*              REPLACE File_Date WITH DTOS(aDir[j,F_WRITE_DATE])
*              REPLACE File_Time WITH aDir[j,F_WRITE_TIME]
*              REPLACE Delete    WITH 'Y'
*          NEXT

           FOR j := 1 TO Len(aFileName)
              APPEND BLANK
              REPLACE File_Num  WITH ALLTRIM(STR(j))
              REPLACE File_Name WITH aFileName[j]       
              REPLACE File_Size WITH aFileSize[j]       
              REPLACE File_Date WITH aFileDate[j]
              REPLACE File_Time WITH aFileTime[j]
              REPLACE Delete    WITH 'Y'
           NEXT
           
           INDEX ON DTOS(File_Date)+File_Time TO StartAidos
           
           DBGOBOTTOM()
           REPLACE Delete WITH 'N'
           mFileName = ALLTRIM(File_Name)
           
           MsgBox(mFileName)
           
           DBGOTOP()
           DO WHILE .NOT. EOF()
              IF Delete = 'Y'
                 ERASE(File_Name)
              ENDIF
              DBSKIP(1)
           ENDDO
           
           CLoseAll()            // Закрытие всех баз данных с ожиданием завершения операций
           IF mFileName <> "___START_AIDOS-X.exe"
              ADS_CopyFile(mFileName, '___START_AIDOS-X.exe', .F., .T.)   // Скопировать новый файл запуска со стандартным именем и удалить новый файл
           ENDIF
        ENDIF
        ******************************************************************************************************************************








        
        
        
        
        
        
        
        
        ******************************************
        
        CLOSE ALL
        
        oSay97:SetCaption(oSay97:caption)
        oButton:SetCaption('&Ok')          // Деструктурирование окна отображения графического Progress-bar
        oButton:activate := {||PostAppEvent(xbeP_Close,,,oDialog)}  //<<<<<< Add This
        DC_AppEvent( @lOk )
*       PostAppEvent(xbeP_Activate,,,DC_GetObject(GetList,'DCGUI_BUTTON_OK'))       // Роджер
        oDialog:Destroy()
        
        aMess := {}
        AADD(aMess, 'База данных: "BigData.dbf" успешно создана')
        LB_Warning(aMess, 'Эксперименты с "BigData.dbf"')
        
        ADS_SERVER_QUIT()
        
        RETURN NIL
        
        ***********************************************************************************************************************

FUNCTION ADS_CopyFile(mFileName1, mFileName2, mDialod, mDelete)    // Копирование файла при ADSDBE ON

      ****** Обработка ошибки ******************

      bError := ErrorBlock( {|e| Break(e)} )           // установить новый кодовый блок обработки ошибок
      BEGIN SEQUENCE                                   // код нормального исполнения

            *** код нормального исполнения
            IF mDialod
               oScr := DC_WaitOn('Копирование файла: '+ALLTRIM(mFileName1)+' ===>>> '+ALLTRIM(mFileName2)+'. Немного подождите!!!',,,,,,,,,,,.F.)
            ENDIF

            CLOSE ALL

            DbeSetDefault("DBFNTX")  // ADS OFF

            COPY FILE (mFileName1) TO (mFileName2)     // <<<===########################## kill
            IF mDelete
               ERASE(mFileName1)
            ENDIF

            DbeSetDefault("ADSDBE")  // ADS ON

            IF mDialod
               DC_Impl(oScr)
            ENDIF

*           IF mDialod
*              aMess := {}
*              AADD(aMess, 'Копирование файла: '+ALLTRIM(mFileName1)+' ===>>> '+ALLTRIM(mFileName2)+' завершено нормально !!!')
*              AADD(aMess, '')
*              LB_Warning(aMess, 'Эксперименты с "BigData.dbf"')
*           ENDIF

            mFlagError = .F.

      RECOVER                                          // код обработки ошибки

            IF mDialod
               DC_Impl(oScr)
               aMess := {}
               AADD(aMess, 'При копировании файла: '+ALLTRIM(mFileName1)+' ===>>> '+ALLTRIM(mFileName2)+' возникла ошибка !!!')
               AADD(aMess, 'С причинами этой ошибки надо разбираться отдельно.')
               AADD(aMess, 'Может быть недостаточно места на диске.')
               LB_Warning(aMess, 'Эксперименты с "BigData.dbf"')
            ENDIF
            mFlagError = .T.
*           EXIT

      ENDSEQUENCE 
      ErrorBlock( bError )                             // переустановить старый кодовый блок
      ******************************************

RETURN(mFlagError)

************************************************************        
FUNCTION LB_Warning( message, ctitle )

    LOCAL aMsg := {}
*    DEFAULT cTitle TO ''
    IF valtype(message) # 'A'
      aadd(aMsg,message)
    ELSE
      aMsg := message
    ENDIF
    IF LEN(ALLTRIM(cTitle)) > 0
       DC_MsgBox(10,10,aMsg,cTitle)
    ELSE
       DC_MsgBox(10,10,aMsg,'Эксперименты с "BigData.dbf"')
    ENDIF

RETURN NIL

***********************************************************************************************************************

***********************************************************************************************************
****** Графический прогресс-бар (на основе примера XSample_14() xdemo.exe)
***********************************************************************************************************
FUNCTION Time_Progress(Time_Progress, Wsego, oProgress, lOk )

    LOCAL nMaxCount := Wsego
    xtime     = Time_Progress

    ** Отображение занимает очень много времени, поэтому показывать прогресс не чаще чем через 0.1 секунды (как в PercTimeVisio())

    T2tp = (DOY(DATE())-1)*86400+SECONDS()          // Текущее время
    IF T2tp - T1tp > 0.1 .OR. xtime = Wsego         // Время в секундах или 100%

*      aSay[mPTVnumb]:SetCaption(mPTVmess+' '+ALLTRIM(STR(mNumPP/Wsego*100,15,7))+'%')

       *** Индикация времени исполнения

       ***** Процесс может идти больше суток, поэтому для определения
       ***** во всех случаях вычисляется время, прошедшее с начала года
*      T_Mess1 = "Начало:"+" "+TIME()           // Начало

       ***** Прошло секунд с начала процесса
       PUBLIC T_Mess2 := "ch:mi:se"
       Sec_2   = (DOY(DATE())-1)*86400+SECONDS() - Sec_1
       ch2 = INT(Sec_2/3600)                    // Часы
       mm2 = INT(Sec_2/60)-ch2*60               // Минуты
       cc2 = Sec_2-ch2*3600-mm2*60              // Секунды
       T_Mess2 = "Прошло:"+" "+ALLTRIM(STRTRAN(T_Mess2,"ch",STR(ch2,19)))
       T_Mess2 = STRTRAN(T_Mess2,"mi",STRTRAN(STR(mm2,2)," ","0"))
       T_Mess2 = STRTRAN(T_Mess2,"se",STRTRAN(STR(cc2,2)," ","0"))
       *@19,2 SAY T_Mess2+" всего: "+ALLTRIM(STR(Sec_2,17))+" сек."

       PUBLIC T_Mess3 := "ch:mi:se"             // Осталось
       Sec_3 = Sec_2*Wsego/xtime                // Прогн.длит.исп. в секундах
       ch3 = INT(Sec_3/3600)                    // Часы
       mm3 = INT(Sec_3/60)-ch3*60               // Минуты
       cc3 = Sec_3-ch3*3600-mm3*60              // Секунды
       T_Mess3 = ALLTRIM(STRTRAN(T_Mess3,"ch",STR(ch3,19)))
       T_Mess3 = STRTRAN(T_Mess3,"mi",STRTRAN(STR(mm3,2)," ","0"))
       T_Mess3 = STRTRAN(T_Mess3,"se",STRTRAN(STR(cc3,2)," ","0"))
       *@20,2 SAY T_Mess3+" всего: "+ALLTRIM(STR(Sec_3,17))+" сек."

       PUBLIC T_Mess4 := "ch:mi:se"             // Окончание
       Sec_4 = Sec_1 + Sec_3 - (DOY(DATE())-1)*86400
       ch4 = INT(Sec_4/3600)                    // Часы
       mm4 = INT(Sec_4/60)-ch4*60               // Минуты
       cc4 = Sec_4-ch4*3600-mm4*60              // Секунды
       T_Mess4 = "Окончание:"+" "+ALLTRIM(STRTRAN(T_Mess4,"ch",STR(ch4,19)))
       T_Mess4 = STRTRAN(T_Mess4,"mi",STRTRAN(STR(mm4,2)," ","0"))
       T_Mess4 = STRTRAN(T_Mess4,"se",STRTRAN(STR(cc4,2)," ","0"))
       *@21,2 SAY T_Mess4+" всего: "+ALLTRIM(STR(Sec_4,17L())+" сек.с нач.суток")

       PUBLIC T_Mess5 := "Средн.время обработки 1-го объекта: ch:mi:se"
       Sec_5 = Sec_2/xtime
       ch5 = INT(Sec_5/3600)                    // Часы
       mm5 = INT(Sec_5/60)-ch5*60               // Минуты
       cc5 = Sec_5-ch5*3600-mm5*60              // Секунды
       T_Mess5 = ALLTRIM(STRTRAN(T_Mess5,"ch",STR(ch5,19)))
       T_Mess5 = STRTRAN(T_Mess5,"mi",STRTRAN(STR(mm5,2)," ","0"))
       T_Mess5 = STRTRAN(T_Mess5,"se",STRTRAN(STR(cc5,2)," ","0"))
       *@22,2 SAY T_Mess5+" всего: "+ALLTRIM(STR(Sec_5,17))+" сек."

       PUBLIC T_Mess6 := "ch:mi:se"             // Осталось
       Sec_6 = Sec_3 - Sec_2
       ch6 = INT(Sec_6/3600)                    // Часы
       mm6 = INT(Sec_6/60)-ch6*60               // Минуты
       cc6 = Sec_6-ch6*3600-mm6*60              // Секунды
       T_Mess6 = "Осталось:"+" "+ALLTRIM(STRTRAN(T_Mess6,"ch",STR(ch6,19)))
       T_Mess6 = STRTRAN(T_Mess6,"mi",STRTRAN(STR(mm6,2)," ","0"))
       T_Mess6 = STRTRAN(T_Mess6,"se",STRTRAN(STR(cc6,2)," ","0"))
       *@23,2 SAY T_Mess6+" всего: "+ALLTRIM(STR(Sec_6,17))+" сек."

       Mess98 = T_Mess1+SPACE(142-LEN(T_Mess1)-LEN(T_Mess4))+T_Mess4  // Начало, окончание (прогноз) 145
       oSay98:SetCaption(Mess98);oSay98:SetCaption(oSay98:caption)

       Mess99 = T_Mess2+SPACE(144-LEN(T_Mess2)-LEN(T_Mess6))+T_Mess6  // Прошло, осталось (прогноз)  146
       oSay99:SetCaption(Mess99);oSay99:SetCaption(oSay99:caption)

       DC_GetProgress( oProgress, Time_Progress, Wsego )              // Отображение графического Progress-bar

*      Sec_1   // Начало
*      Sec_4   // Окончание
*      Sec_2   // Прошло секунд с начала процесса
*      Sec_6   // Осталось секунд до окончания

*      mTimeProgress=ROUND(Sec_2/(Sec_2+Sec_6)*100,0)
*      DC_GetProgress( oProgress, mTimeProgress, 100 )                // Отображение графического Progress-bar

*      DC_GetProgress( oProgress, ROUND(Sec_2,0), ROUND(Sec_2+Sec_6,0) )                // Отображение графического Progress-bar

*      MsgBox(STR(ROUND(Sec_2,0))+STR(ROUND(Sec_2+Sec_6,0)))
*      MsgBox(STR(mTimeProgress))
*      MILLISEC(1000)

*      K=100/Wsego;mTimeProgress=ROUND(K*Time_Progress,0)
*      DC_GetProgress( oProgress, mTimeProgress, 100 )                // Отображение графического Progress-bar

       DC_AppEvent( @lOk, 0, .01 )

       T1tp = T2tp
    ENDIF

RETURN lOk

***************************************************************************
***************************************************************************
*==================================
* CONTENTS: ADS SERVER PROGRAMS
*==================================
* PROCEDURE DBESYS()
* FUNCTION ADS_SERVER_START()
* FUNCTION ADS_SERVER_QUIT()
* FUNCTION ADS_SERVER_TIP(oSession)

***************************************************************************
FUNCTION ADS_SERVER_START()
***************************************************************************

  PUBLIC oSession := NIL
  PUBLIC cServerTip := ""
  PUBLIC Server_DRIVE := "C:"
 // connect to the ADS server
  oSession := dacSession():New( "ADSDBE", Server_DRIVE )

  cr:=chr(13)

  IF ( oSession:isConnected() ) = .T.

       cServerTip := ADS_SERVER_TIP(oSession)
       // test message only
       confirmbox(,"Connecting to server "+cServerTip         +cr+;
                   "to location: server drajv "+Server_DRIVE  +cr+;
                   " "                                        +cr+;
                   "Advantage Database Server is ON"          +cr+;
                   " "                                        ,;
                   "SERVER: connection OK",;
                 XBPMB_OK,XBPMB_INFORMATION,XBPMB_SYSMODAL)

  ELSE  // Konekcija nije uspela obavezno izdaj poruku!
        // Connection failed be sure to issue a message!

       cServerTip := ADS_SERVER_TIP(oSession)
       // issue a message
       error := var2char(oSession:getLastError())
       confirmbox(,"Connecting to server "+cServerTip           +cr+;
                   "to location: server drajv "+Server_DRIVE    +cr+;
                   " "                                          +cr+;
                   "Advantage Database Server is OFF"           +cr+;
                   " "                                          +cr+;
                   "Server connection Error: "+error            +cr+;
                   " "                                          ,;
                   "SERVER: connection Error",;
                   XBPMB_OK,XBPMB_CRITICAL,XBPMB_SYSMODAL)
      ******
       QUIT
      ******

  ENDIF
RETURN NIL



***************************************************************************
FUNCTION ADS_SERVER_QUIT()
***************************************************************************
 // disconnect from the ADS
 cServerTip := ADS_SERVER_TIP(oSession)
 **********************
 oSession:disconnect()
 **********************

 cr:=chr(13)

 confirmbox(,"Disconnecting from server "+cServerTip     +cr+;
             "to location: server drajv "+Server_DRIVE   +cr+;
             " "                                         +cr+;
             "Advantage Database Server is OFF"          +cr+;
             " "                                         ,;
             "SERVER: diskonnection OK",;
             XBPMB_OK,XBPMB_INFORMATION,XBPMB_SYSMODAL )
RETURN NIL


***************************************************************************
FUNCTION ADS_SERVER_TIP(oSession)
***************************************************************************
nServerType := oSession:setProperty( ADSDBE_SERVER_TYPE )

IF nServerType == ADSDBE_LOCAL .OR. nServerType == 0
    RETURN "::LOCAL SERVER"
ELSE
    RETURN "::REMOTE SERVER"
ENDIF
RETURN "::STOP SERVER"

******************************************************************************************
Function CLoseAll()            // Закрытие всех баз данных с ожиданием завершения операций
******************************************************************************************
LOCAL bError , aWorkareas , x, y

bError := ErrorBlock( {|e| Break(e)} )
aWorkAreas := workspacelist()
y := len(aWorkAreas)

for x = 1 to y
  BEGIN SEQUENCE
    (aWorkAreas[x])->(DbClearRelation())
    (aWorkAreas[x])->(DbCloseArea())
  ENDSEQUENCE
next
ErrorBlock(bError)
bError   := nil
Return nil
******************************************************************************************
Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von Eugeny Lutsenko »

Die Indizierung hat ohne ADS immer gut funktioniert. Mit ADS funktioniert es manchmal auch, normalerweise zum 1. Mal. Und dann gibt es einen Fehler beim Zugriff auf die Datenbank. Es scheint, dass sie beschäftigt ist:

Code: Alles auswählen

       CASE FIELDTYPE(ff)="C"                           // Символьные столбцы
*           MsgBox('STOP')
            DO CASE
               CASE M_ClSc1 <= ff .AND. ff <= M_ClSc2   // КЛАССИФИКАЦИОННЫЕ ШКАЛЫ:
                    ++K_C_ClSc
*                   INDEX ON SUBSTR(FIELDGET(ff),1,256) TO Inp_tmp UNIQUE                         // Не работает в ADS <<<===################################
*                   INDEX ON PadRight(FIELDGET(ff),256,".") TO Inp_tmp UNIQUE                     // Работает в ADS, но не всегда. В ADS длина ключа индекса должна быть ФИКСИРОВАННОЙ
                    INDEX ON PadRight(ALLTRIM(FIELDGET(ff)),FIELDSIZE(ff),".") TO Inp_tmp UNIQUE           // Работает в ADS, но не всегда. В ADS длина ключа индекса должна быть ФИКСИРОВАННОЙ
                    COUNT TO Cr
                    K_C_GrClSc = K_C_GrClSc + Cr
               CASE M_OpSc1 <= ff .AND. ff <= M_OpSc2   // ОПИСАТЕЛЬНЫЕ ШКАЛЫ:
                    ++K_C_OpSc
*                   INDEX ON SUBSTR(FIELDGET(ff),1,256) TO Inp_tmp UNIQUE                         // Не работает в ADS <<<===################################
*                   INDEX ON PadRight(FIELDGET(ff),256,".") TO Inp_tmp UNIQUE                     // Работает в ADS, но не всегда. В ADS длина ключа индекса должна быть ФИКСИРОВАННОЙ
                    INDEX ON PadRight(ALLTRIM(FIELDGET(ff)),FIELDSIZE(ff),".") TO Inp_tmp UNIQUE           // Работает в ADS, но не всегда. В ADS длина ключа индекса должна быть ФИКСИРОВАННОЙ

                    COUNT TO Cr
                    K_C_GrOpSc = K_C_GrOpSc + Cr
            ENDCASE
    ENDCASE
Dateianhänge
Безымянный.jpg
Безымянный.jpg (62.38 KiB) 5186 mal betrachtet
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von nightcrawler »

5381 ist kein ADS Fehler. Der muss von Xbase++ kommen.
Wie sieht denn der Index-Ausdruck direkt in der NTX-Datei aus? Fieldget ist keine unterstützte Funktion, kommt als vom Client. Das könnte schon das Problem sein.
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von Tom »

Sind die ADSDBE.DLL und die ACE32.DLL passend zur eingesetzten Xbase++- und ADS-Version?
Herzlich,
Tom
Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von Eugeny Lutsenko »

Tom hat geschrieben: Mi, 09. Feb 2022 12:05 Sind die ADSDBE.DLL und die ACE32.DLL passend zur eingesetzten Xbase++- und ADS-Version?
Hallo, Tom! Indexausdrücke sind im folgenden Codeausschnitt aufgeführt. Man sieht, wie ich mit ihnen experimentiert habe, verschiedene Optionen in Betracht gezogen habe. Ohne Fieldget durch Arrays von Feldnamen und -größen habe ich es auch versucht. Es hat auch nicht geklappt. Ohne ADS funktioniert das gut

Code: Alles auswählen

       CASE FIELDTYPE(ff)="C"                           // Символьные столбцы
*           MsgBox('STOP')
            DO CASE
               CASE M_ClSc1 <= ff .AND. ff <= M_ClSc2   // КЛАССИФИКАЦИОННЫЕ ШКАЛЫ:
                    ++K_C_ClSc
*                   INDEX ON SUBSTR(FIELDGET(ff),1,256) TO Inp_tmp UNIQUE                         // Не работает в ADS <<<===################################
*                   INDEX ON PadRight(FIELDGET(ff),256,".") TO Inp_tmp UNIQUE                     // Работает в ADS, но не всегда. В ADS длина ключа индекса должна быть ФИКСИРОВАННОЙ
                    INDEX ON PadRight(ALLTRIM(FIELDGET(ff)),FIELDSIZE(ff),".") TO Inp_tmp UNIQUE           // Работает в ADS, но не всегда. В ADS длина ключа индекса должна быть ФИКСИРОВАННОЙ
                    COUNT TO Cr
                    K_C_GrClSc = K_C_GrClSc + Cr
               CASE M_OpSc1 <= ff .AND. ff <= M_OpSc2   // ОПИСАТЕЛЬНЫЕ ШКАЛЫ:
                    ++K_C_OpSc
*                   INDEX ON SUBSTR(FIELDGET(ff),1,256) TO Inp_tmp UNIQUE                         // Не работает в ADS <<<===################################
*                   INDEX ON PadRight(FIELDGET(ff),256,".") TO Inp_tmp UNIQUE                     // Работает в ADS, но не всегда. В ADS длина ключа индекса должна быть ФИКСИРОВАННОЙ
                    INDEX ON PadRight(ALLTRIM(FIELDGET(ff)),FIELDSIZE(ff),".") TO Inp_tmp UNIQUE           // Работает в ADS, но не всегда. В ADS длина ключа индекса должна быть ФИКСИРОВАННОЙ

                    COUNT TO Cr
                    K_C_GrOpSc = K_C_GrOpSc + Cr
            ENDCASE
    ENDCASE
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von HaPe »

Hallo Eugeny !

FIELDSIZE ist doch auch eine Xbase-Funktion; die kennt der ADS auch nicht.

Grundsätzlich sind beim Upsizing von DBF auf SQL-Server wie ADS, PostGreSQL, $MS-SQL, ... alle Xbase-spezifischen Funktionen durch Funktionen des SQL-Servers zu ersetzen.
Dazu gehören auch Stringfunktionen, die in Xbase per + Zeichenketten addieren zb. mittels der ConCat-Funktion auf dem jeweiligen SQL-Server zu ersetzten.
Es hilft auch, auf dem SQL-Server die passenden gleichnamigen Funktionen als Stored-Procedures anzulegen, also FIELDGET und FIELDSIZE.

Ich habe zb. in meinen SQL-Selects, alle + -Funktionen der Zeichenketten durch ConCat ersetzt und in meinen Xbase/VFP-Programmen die Funktion ConCat hinzugefügt. So kann ich die Datenbank von Xbase/VFP auf $MS-SQL oder PostGreSQL umschalten ...
--
Hans-Peter
Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von Eugeny Lutsenko »

HaPe hat geschrieben: Mi, 09. Feb 2022 12:38 Hallo Eugeny !

FIELDSIZE ist doch auch eine Xbase-Funktion; die kennt der ADS auch nicht.

Grundsätzlich sind beim Upsizing von DBF auf SQL-Server wie ADS, PostGreSQL, $MS-SQL, ... alle Xbase-spezifischen Funktionen durch Funktionen des SQL-Servers zu ersetzen.
Dazu gehören auch Stringfunktionen, die in Xbase per + Zeichenketten addieren zb. mittels der ConCat-Funktion auf dem jeweiligen SQL-Server zu ersetzten.
Es hilft auch, auf dem SQL-Server die passenden gleichnamigen Funktionen als Stored-Procedures anzulegen, also FIELDGET und FIELDSIZE.

Ich habe zb. in meinen SQL-Selects, alle + -Funktionen der Zeichenketten durch ConCat ersetzt und in meinen Xbase/VFP-Programmen die Funktion ConCat hinzugefügt. So kann ich die Datenbank von Xbase/VFP auf $MS-SQL oder PostGreSQL umschalten ...
Hallo, HaPe! Ich hatte einen ähnlichen Gedanken. Die Wahrheit ist, ich habe vor dem Namen der Funktion hinzugefügt: "ADS_". Und irgendwo werden die Funktionen der Arbeit mit DBF-Datenbanken beschrieben, die ADS kennt? Vielleicht gibt es schon irgendwo eine Bibliothek oder noch besser nur den Quellcode, um die üblichen Alaska-Funktionen mit SQL-ADS zu implementieren? Es sollte auch beachtet werden, dass ich portable lokale ADS verwende. Ich habe sehr viel über ADS SQL gefunden. Aber ich muss jetzt so einfach wie möglich mit minimalem Arbeitsaufwand von einem klassischen DBFNTX zu einem tragbaren lokalen ADS wechseln. Ich habe den Eindruck, dass ich von allem, was ich gefunden habe, weniger als 1% dafür benötige.
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von nightcrawler »

Es gibt funktional keinen Unterschied zwischen dem Local Server und dem Database Server (Ausnahme: Replication, Online Backup, ALTER ONLINE).
Eine gute Übersicht über die zu verwendenden Funktionen gibt es hier: https://devzone.advantagedatabase.com/d ... index.html Advantage Concepts - Advantage Functionality - Advantage Expression Engine
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von Tom »

In der Hilfe zur ADSDBE ist ebenfalls aufgelistet, welche Funktionen in Indexausdrücken verwendet werden dürfen und welche nicht.
adslimits.png
adslimits.png (45.4 KiB) 5161 mal betrachtet
Herzlich,
Tom
Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von Eugeny Lutsenko »

Hi, nightcrawler, Tom!

Vielen Dank! Natürlich habe ich die ADS-Hilfe gesehen, aber ich habe sie irgendwie nicht sehr bewusst angesehen. Jetzt verstehe ich es. Ich weiß, was ich brauche. Ich brauche die Indizierung der Datenbank nach einem Feld, dessen Name oder Nummer im Array ist. So etwas wie das:

Code: Alles auswählen

                    mFieldName = aFieldName[ff]
                    mFieldSize = aFieldSize[ff]
                    INDEX ON PadRight(&mFieldName,mFieldSize,".") TO Inp_tmp UNIQUE                         // Не работает в ADS <<<===################################
Aber das Programm stürzt sofort ab, ohne einen Fehler auszugeben. Ich werde mir überlegen, wie ich das machen soll. Aber in diesem Zusammenhang stellt sich eine allgemeinere Frage: Ist es möglich, eine Funktion zu erstellen, die den als Parameter angegebenen Befehl zur Ausführung ausführt? Es ist möglich, einen Codeblock in dieser Funktion zu verwenden. Dann werde ich den Indizierungsbefehl sofort mit dem Namen des gewünschten Feldes angeben, nach dem ich indizieren soll... Und in anderen ähnlichen Fällen wird es sehr nützlich sein...

Diese Funktion würde in meiner Situation eine solche Lösung bieten:

Code: Alles auswählen

BefehlAusführen("INDEX ON PadRight("dies ist direkt der Name des Feldes",256,".") TO Inp_tmp UNIQUE")
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von ramses »

Hallo Eugeny

du darfts keine Macros(&) und vieles anderes nicht im Index verwenden / angeben.

es müsste etwa so sein: index on padr( feld, 25,"." ) to inp_tmp unique

Evtl. geht padr() aber nur mit 2 Parameter: index on padr( feld, 25 ) to inp_tmp unique
Valar Morghulis

Gruss Carlo
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von Werner_Bayern »

Hallo Eugeny,

wie hast Du es geschafft, einen connect zu einem ADS ohne ADS-Server zu bekommen? Bei mir funktioniert das nicht:

Code: Alles auswählen

      IF .NOT. file(programmpfad() + "ads.ini")
         memowrit(programmpfad() + "ADS.ini", "[DRIVES]" + CRLF + programmpfad() + "daten" + CRLF + "[SETTINGS]" + CRLF +;
         "ADS_SERVER_TYPE = 1" + CRLF)
      ENDIF
      IF !DbeLoad("ADSDBE", .F.)
         fehler("ADS - " + MSG_DBE_NOT_LOADED)
      ENDIF
      DbeSetDefault("ADSDBE")
      oADS := DacSession():New("DBE=ADSDBE;SERVER=D:;ADS_LOCAL_SERVER")
      IF .NOT. oADS:isConnected()
         fehler("ADS-Fehler " + var2Char(oADS:getLastError()) + ": " + oADS:getLastMessage())
      ENDIF
Wie schaut Deine ads.ini aus?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von Werner_Bayern »

Hat sich erledigt, bin bei Pablo fündig geworden, es muss die adsloc32.dll gefunden werden.

edit: Sorry, Roger, nicht Pablo #-o
Zuletzt geändert von Werner_Bayern am So, 13. Feb 2022 17:23, insgesamt 1-mal geändert.
es grüßt

Werner

<when the music is over, turn off the lights!>
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von ramses »

Ja, und das Config File für den Local Server heisst anderes: adslocal.cfg

siehe u.A.: https://devzone.advantagedatabase.com/d ... ration.htm
Valar Morghulis

Gruss Carlo
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von Werner_Bayern »

Danke Carlo,

dann wird die ads.ini da nicht berücksichtigt, ist also nicht nötig?
es grüßt

Werner

<when the music is over, turn off the lights!>
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von ramses »

Hallo Werner

ich habe zwar schon lange nichts mehr mit ADS gemacht. Aber JA so war/ist es die ADS.INI ist ist nur für den Remote-Server, die adslocal.cfg nur für den Local-Server. Da musst du auch die beiden Einträge ANSI_CHAR_SET=GERMAN und OEM_CHAR_SET=GERMAN einfügen .....

Ich nehme nicht an das da kürzlich noch was geändert wurde.
Valar Morghulis

Gruss Carlo
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von Werner_Bayern »

Servus Carlo,

hab ich gemacht:

Code: Alles auswählen

[SETTINGS]
ANSI_CHAR_SET=GERMAN
OEM_CHAR_SET=GERMAN
Aber Umlaute passen nicht. Hab

Code: Alles auswählen

SET CHARSET TO ansi
und DBF/NTX, also OEM.

Woran fehlts?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von nightcrawler »

ads.ini wird auch bei local server verwendet .... wie sollte man sonst mit einem ini-Eintrag in dieser Datei den Servertyp festlegen können?

Werner: was ist aktuell Dein Problem? Bekommst Du eine Fehlermeldung? Falls ja, welche?
Für den Local Server unter 32Bit brauchst du die komplette Client Engine:
ace32.dll
adsloc32.dll
adslocal.cfg
ansi.chr
extend.chr

bei Unicode zusätzlich
aicu32.dll
adscollate.adt/adm
icudt40l.dat
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von ramses »

nightcrawler hat geschrieben: Mo, 14. Feb 2022 7:31 ads.ini wird auch bei local server verwendet .... wie sollte man sonst mit einem ini-Eintrag in dieser Datei den Servertyp festlegen können?
Entschuldige: Als ich das Ding noch benutzt hatte ging das immer mit dem Connect-String etwa so:

Code: Alles auswählen

oADS := DacSession():New("DBE=ADSDBE;SERVER=D:;ADS_LOCAL_SERVER")
Das funktionert in den alten nicht aktuellen Apps noch immer.
Valar Morghulis

Gruss Carlo
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von Werner_Bayern »

Servus,

ja, die ads.ini scheint obsolet zu sein, es funktioniert mit dieser adslocal.cfg. Die beiden .chr-Dateien hab ich jetzt ins EXE-Verzeichnis kopiert, kein Unterschied, bekomme keine Umlaute:
test.PNG
test.PNG (5.78 KiB) 4841 mal betrachtet
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von nightcrawler »

Hallo Werner,
bekommst Du im Data Architect die Umlaute richtig?
Ich meine mich zu erinnern, dass bei manchen Xbase++-Anwendungen die Collation der Oberfläche von der der DB Engine getrennt werden musste. Die im ADS verwendete ist nur für die Sortierung zuständig, nicht für die Anzeige. Der Architect (in Delphi) nutzt dies aber anders, dort wird die Collation für die Oberfläche automatisch der der DB angepasst. Das könnte bei Xbase++ unterschiedlich sein.
Ich meinte da war irgendwo mal ein SET COLLATION TO WINDOWS o.ä.
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von Eugeny Lutsenko »

nightcrawler hat geschrieben: Mo, 14. Feb 2022 7:31 ads.ini wird auch bei local server verwendet .... wie sollte man sonst mit einem ini-Eintrag in dieser Datei den Servertyp festlegen können?

Werner: was ist aktuell Dein Problem? Bekommst Du eine Fehlermeldung? Falls ja, welche?
Für den Local Server unter 32Bit brauchst du die komplette Client Engine:
ace32.dll
adsloc32.dll
adslocal.cfg
ansi.chr
extend.chr

bei Unicode zusätzlich
aicu32.dll
adscollate.adt/adm
icudt40l.dat
ADS.INI:

Code: Alles auswählen

[SETTINGS]
; 1 - Local, 2 - Client
ADS_SERVER_TYPE=1

; NTX or CDX
;ADS_INDEX_TYPE=CDX
ADS_INDEX_TYPE=NTX

MTIER_LOCAL_CONNECTIONS=1

Code: Alles auswählen

**************************************************************************************************
*** Функции Слободана для работы c Advantage Database Server (ADS)
**************************************************************************************************

*==================================
* CONTENTS: ADS SERVER PROGRAMS
*==================================
* PROCEDURE DBESYS()
* FUNCTION ADS_SERVER_START()
* FUNCTION ADS_SERVER_QUIT()
* FUNCTION ADS_SERVER_TIP(oSession)

***************************************************************************
*PROCEDURE DBESYS()  // Overload the default DBESYS for your required DBE
***************************************************************************
*//----- FOXCDX: DBF-FPT-CDX
*  IF ! DbeLoad( "FOXDBE", .T.)     // load engine for DBF files
*     msgbox( "Database Engine FOXDBE not loaded" , "STOP" )
*     QUIT
*  ENDIF
*  IF ! DbeLoad( "CDXDBE", .T.)     // load engine for DBF files
*     msgbox( "Database Engine CDXDBE not loaded" , "STOP" )
*     QUIT
*  ENDIF
*  DbeBuild( "FOXCDX", "FOXDBE", "CDXDBE" )   // DBE=FOXCDX
*  *** DbeSetDefault("FOXCDX")  // OFF

*//----- DBFNTX: DBF-DBT-NTX
*// ADS client engine and ALS Local Server engine exist
*// Overload the default DBESYS for your required DBE
*// system for working with DBF/NTX files on both server and client

*  IF ! DbeLoad( "DBFDBE")     // load engine for DBF files
*     msgbox( "Database Engine DBFDBE not loaded" , "STOP" )
*     QUIT
*  ENDIF
*  IF ! DbeLoad( "NTXDBE")     // load engine for DBF files
*     msgbox( "Database Engine NTXDBE not loaded" , "STOP" )
*     QUIT
*  ENDIF
*  DbeBuild( "DBFNTX", "DBFDBE", "NTXDBE" )   // DBE=DBFNTX
*  *** DbeSetDefault("DBFNTX")  // OFF

*//----- ADSDBE: DBF-DBT-NTX
*// there must be ACE32.DLL otherwise it breaks here !!!
*// mora postojati ACE32.DLL inaиe ovde pukne !!!
*//-----------------------------------------------------
*   IF ! DbeLoad( "ADSDBE", .F.)     // load engine for ADS
*      msgbox( "Database Engine ADSDBE not loaded" , "STOP" )
*      QUIT
*   ENDIF

   ***********************
*  DbeSetDefault("ADSDBE")  // ON
   ***********************

*RETURN

***************************************************************************
FUNCTION ADS_SERVER_START()
***************************************************************************

  PUBLIC oSession := NIL
  PUBLIC cServerTip := ""
  PUBLIC Server_DRIVE := "C:"
 // connect to the ADS server
  oSession := dacSession():New( "ADSDBE", Server_DRIVE )

  cr:=chr(13)

  IF ( oSession:isConnected() ) = .T.

       cServerTip := ADS_SERVER_TIP(oSession)
*      // test message only
*      confirmbox(,"Connecting to server "+cServerTip         +cr+;
*                  "to location: server drajv "+Server_DRIVE  +cr+;
*                  " "                                        +cr+;
*                  "Advantage Database Server is ON"          +cr+;
*                  " "                                        ,;
*                  "SERVER: connection OK",;
*                XBPMB_OK,XBPMB_INFORMATION,XBPMB_SYSMODAL)

  ELSE  // Konekcija nije uspela obavezno izdaj poruku!
        // Connection failed be sure to issue a message!

       cServerTip := ADS_SERVER_TIP(oSession)
       // issue a message
       error := var2char(oSession:getLastError())
*      confirmbox(,"Connecting to server "+cServerTip           +cr+;
*                  "to location: server drajv "+Server_DRIVE    +cr+;
*                  " "                                          +cr+;
*                  "Advantage Database Server is OFF"           +cr+;
*                  " "                                          +cr+;
*                  "Server connection Error: "+error            +cr+;
*                  " "                                          ,;
*                  "SERVER: connection Error",;
*                  XBPMB_OK,XBPMB_CRITICAL,XBPMB_SYSMODAL)
      ******
       QUIT
      ******

  ENDIF
RETURN NIL



***************************************************************************
FUNCTION ADS_SERVER_QUIT()
***************************************************************************
 // disconnect from the ADS
 cServerTip := ADS_SERVER_TIP(oSession)
 **********************
 oSession:disconnect()
 **********************

 cr:=chr(13)

*confirmbox(,"Disconnecting from server "+cServerTip     +cr+;
*            "to location: server drajv "+Server_DRIVE   +cr+;
*            " "                                         +cr+;
*            "Advantage Database Server is OFF"          +cr+;
*            " "                                         ,;
*            "SERVER: diskonnection OK",;
*            XBPMB_OK,XBPMB_INFORMATION,XBPMB_SYSMODAL )
RETURN NIL


***************************************************************************
FUNCTION ADS_SERVER_TIP(oSession)
***************************************************************************
nServerType := oSession:setProperty( ADSDBE_SERVER_TYPE )

IF nServerType == ADSDBE_LOCAL .OR. nServerType == 0
    RETURN "::LOCAL SERVER"
ELSE
    RETURN "::REMOTE SERVER"
ENDIF
RETURN "::STOP SERVER"

*** Функции Слободана для работы c Advantage Database Server (ADS)
***************************************************************************

Code: Alles auswählen

/*
     *** (C) д.э.н., к.т.н., профессор Луценко Евгений Вениаминович, Россия, Краснодар.
     *** 4:57 27.01.2022.    Эксперименты с БД максимального размера с ADSDBE
*/
     ********************
     #include "adsdbe.ch"  // ADSDBE = ADS SERVER ENGINE
     ********************
     #include "dcdir.ch"
     #include "natmsg.ch"
     #include "appevent.ch"
     #include "xbp.ch"
     #include "dll.ch"
     #include "dccursor.ch"
     #Include "thread.ch"
     #include "class.ch"
     #include "dmlb.ch"
     #include "fileio.ch"
     #include "dctree.ch"
*    #include "SystemMetrics.ch"
*    #include "axcdxcmx.ch"  // Графика ActiveX
     #include "collat.ch"
     #include "common.ch"
     #include "dbedit.ch"
     #include "dbfdbe.ch"
     #include "dcapp.ch"
     #include "dcbitmap.ch"
     #include "dccargo.ch"
     #include "dcdialog.ch"
     #include "dcdir.ch"
     #include "dcfiles.ch"
     #include "dcgra.ch"
     #include "dcgraph.ch"        // графика
     #include "BdColors.Ch"       // графика
     #include "dccolors.ch"       // графика
     #include "dcprint.ch"        // графика
     #include "dcicon.ch"
     #include "dcmsg.ch"
     #include "dcpick.ch"
     #include "deldbe.ch"
     #include "dmlb.ch"
     #include "express.ch"
     #include "fileio.ch"
     #include "font.ch"
     #include "gra.ch"
     #include "inkey.ch"
     #include "memvar.ch"
     #include "prompt.ch"
     #include '_dcdbfil.ch'
     #include "set.ch"
     #include "std.ch"
     #include "xbp.ch"
     #include '_dcappe.ch'
     #include 'dcscope.ch'
     #include '_dcstru.ch'
     #include 'dcfields.ch'
     #include 'dccolor.ch'
     #include "Fileio.ch"    // Max_DB
     *#include "rmchart.ch"   // Графика ActiveX
     *#include "dcads.ch"
     
     #pragma library( "ascom10.lib" )
     #pragma library( "dclip1.lib" )
     #pragma library( "dclip2.lib" )
     #pragma library( "dclipx.lib" )
     #pragma library( "xbtbase1.lib" )
     #pragma library( "xbtbase2.lib" )
     #pragma library( "xppui2.lib" )
     #Pragma Library("Taskbar.lib")

     #include "directry.ch"                 // 2.0
     #pragma Library( "ASINet10.lib" )      // 2.0
     
     PROCEDURE AppSys
        // Рабочий стол остается окном приложения
     RETURN

     ***************************************************************************
     PROCEDURE DBESYS()  // Overload the default DBESYS for your required DBE   
     ***************************************************************************
     //----- FOXCDX: DBF-FPT-CDX                                                
       IF ! DbeLoad( "FOXDBE", .T.)     // load engine for DBF files            
          msgbox( "Database Engine FOXDBE not loaded" , "STOP" )                
          QUIT                                                                  
       ENDIF                                                                    
       IF ! DbeLoad( "CDXDBE", .T.)     // load engine for DBF files            
          msgbox( "Database Engine CDXDBE not loaded" , "STOP" )                
          QUIT                                                                  
       ENDIF                                                                    
       DbeBuild( "FOXCDX", "FOXDBE", "CDXDBE" )   // DBE=FOXCDX                 
       *** DbeSetDefault("FOXCDX")  // OFF                                      
                                                                                
     //----- DBFNTX: DBF-DBT-NTX                                                
     // ADS client engine and ALS Local Server engine exist                     
     // Overload the default DBESYS for your required DBE                       
     // system for working with DBF/NTX files on both server and client         
                                                                                
       IF ! DbeLoad( "DBFDBE")     // load engine for DBF files                 
          msgbox( "Database Engine DBFDBE not loaded" , "STOP" )                
          QUIT                                                                  
       ENDIF                                                                    
       IF ! DbeLoad( "NTXDBE")     // load engine for DBF files                 
          msgbox( "Database Engine NTXDBE not loaded" , "STOP" )                
          QUIT                                                                  
       ENDIF                                                                    
       DbeBuild( "DBFNTX", "DBFDBE", "NTXDBE" )   // DBE=DBFNTX                 
       *** DbeSetDefault("DBFNTX")  // OFF                                      
                                                                                
                                                                                
     //----- ADSDBE: DBF-DBT-NTX                                                
     // there must be ACE32.DLL otherwise it breaks here !!!                    
     // mora postojati ACE32.DLL inaиe ovde pukne !!!                           
     //-----------------------------------------------------                    
        IF ! DbeLoad( "ADSDBE", .F.)     // load engine for ADS                 
           msgbox( "Database Engine ADSDBE not loaded" , "STOP" )               
           QUIT                                                                 
        ENDIF                                                                   
                                                                                
        ***********************                                                 
        DbeSetDefault("ADSDBE")  // ON                                          
        ***********************                                                 
                                                                                
     RETURN                                                                     

     
     ********************************************************************************
     ********************************************************************************
     FUNCTION Main()
     
        LOCAL Getlist := {}, oProgress, oDialog
        LOCAL aSay[30], Mess97, Mess98, Mess99               // Массив сообщений отображаемых стадий исполнения (до 30 на экране)

        DC_IconDefault(1000)

        ADS_SERVER_START()

        SET DECIMALS TO 15
        SET DATE GERMAN
        SET ESCAPE On

        ********************************************************************

        mNField  = 10           // Максимум 2040
        mNRecord = 10           // Максимум 1000000000000

        @1,1  DCGROUP oGroup1 CAPTION 'Задайте параметры базы данных:' SIZE 40.0, 3.5

        @1,2  DCSAY "Количество полей:"                  PARENT oGroup1 
        @1,20 DCSAY "" GET mNField  PICTURE "##########" PARENT oGroup1 

        @2,2  DCSAY "Количество записей:"                PARENT oGroup1 
        @2,20 DCSAY "" GET mNRecord PICTURE "##########" PARENT oGroup1 

        DCREAD GUI;
              TO lExit ;
              FIT;
              ADDBUTTONS;
              MODAL;
              TITLE 'Эксперименты с ADS и PGDBU'
              IF lExit
                 ** Button Ok
              ELSE
                 QUIT
              ENDIF
        ********************************************************************

        Wsego = mNRecord
        
        // Отображение стадии исполнения. Будет написано прямо в окне Progress-bar
        d = 0
        @0,0 DCGROUP oGroup1 CAPTION 'Стадии исполнения процесса' FONT "6.Helv" SIZE 105+d, 2.5 PARENT oTabPage1
        @4,0 DCGROUP oGroup2 CAPTION 'Прогноз времени исполнения' FONT "6.Helv" SIZE 105+d, 5.0 PARENT oTabPage2
        
         s = 1
        @s++,1 DCSAY " " SAYSIZE 100 SAYOBJECT aSay[ 1] FONT "10.Helv"
         s++
        @s++,1 DCSAY " " SAYSIZE 100 SAYOBJECT oSay97   FONT "10.HelvBold"
         s++
        @0.2+s++,1 DCSAY " " SAYSIZE 100 SAYOBJECT oSay98 FONT "9.Helv Bold" COLOR GRA_CLR_BLUE
        @1.5+s  ,1 DCSAY " " SAYSIZE 100 SAYOBJECT oSay99 FONT "9.Helv Bold" COLOR GRA_CLR_BLUE
        
        @s  ,1 DCPROGRESS oProgress ;
               SIZE 95,1.5 ;
               PERCENT ;
               EVERY 1;                          // Кол-во обновлений изображения
               MAXCOUNT Wsego; 
               COLOR GRA_CLR_CYAN                // Цвет полосы
        @s++,97 DCPUSHBUTTON  CAPTION '&Cancel' ;
               ACTION {||lOk:=.T.} OBJECT oButton ;
               SIZE 7,1.5
        DCREAD GUI ;
               TITLE 'Создание базы данных "BigData.dbf"' ;
               PARENT @oDialog  ;
               FIT ;
               EXIT ;
               MODAL
        
        oDialog:alwaysOnTop = .T.       // Окно открывается на переднем плане
        oDialog:show()
        
        ****** Обработка ошибки ******************
        bError := ErrorBlock( {|e| Break(e)} )           // установить новый кодовый блок обработки ошибок
        BEGIN SEQUENCE                                   // код нормального исполнения
        
              *** код нормального исполнения
        
              aStructure := { { "NumbRecord"  , "N", 19, 0} }
              
              FOR j=1 TO mNField
                  FieldName = "F"+ALLTRIM(STR(j,19))
                  AADD(aStructure, { FieldName  , "N", 19, 7 })
              NEXT
              DbCreate( "BigData.dbf", aStructure )
        
        RECOVER                                          // код обработки ошибки
              aMess := {}
              AADD(aMess, "Возникла ошибка при попытке создания БД с числом полей: "+ALLTRIM(STR(mNField)))
              LB_Warning(aMess, 'Эксперименты с "BigData.dbf"')
              MsgBox('')
              ADS_SERVER_QUIT()
              QUIT
        ENDSEQUENCE 
        ErrorBlock( bError )                             // переустановить старый кодовый 
        ******************************************
        
        // Начало отсчета времени для прогнозирования длительности исполнения
        Time_progress = 0
        // Прошло секунд с начала процесса
        // Процесс может идти больше суток, поэтому для определения
        // во всех случаях вычисляется время, прошедшее с начала года
           T_Mess1    = "Начало:"+" "+TIME()            // Начало
           Sec_1      = (DOY(DATE())-1)*86400+SECONDS()
           PUBLIC T1 := (DOY(DATE())-1)*86400+SECONDS()        // Время предыдущей индикации процесса исполнения
           PUBLIC T2 := (DOY(DATE())-1)*86400+SECONDS()+1      // Текущее время (1-й раз оно заметно больше T1 чтобы было отображение)
           PUBLIC T1tp := T1
           PUBLIC T2tp := T2
        *********************************************************************************
        
        ****** Обработка ошибки ******************
        bError := ErrorBlock( {|e| Break(e)} )           // установить новый кодовый блок обработки ошибок
        BEGIN SEQUENCE                                   // код нормального исполнения
        
              *** код нормального исполнения
        
              aSay[ 1]:SetCaption('Идет процесс создания базы данных: "BigData.dbf"')
        
              USE BigData EXCLUSIVE NEW
        
              FOR r=1 TO mNRecord
        
                  APPEND BLANK
                  REPLACE NumbRecord WITH r
        
                  lOk = Time_Progress (++Time_Progress, mNRecord, oProgress, lOk )
        
              NEXT
        
        RECOVER                                          // код обработки ошибки
              CLOSE ALL
              aMess := {}
              AADD(aMess, "Возникла ошибка при попытке добавления в БД записи N=й: "+ALLTRIM(STR(r)))
              LB_Warning(aMess, 'Эксперименты с "BigData.dbf"')
              MsgBox('')
*             ADS_SERVER_QUIT()
*             QUIT
        ENDSEQUENCE 
        ErrorBlock( bError )                             // переустановить старый кодовый 
        ******************************************

        ADS_CopyFile('BigData.dbf', 'BigDdds.dbf', .T., .F.)

        ***** Удаление старых версий файла START_AIDOS запуска и обновления системы Эйдос, если они есть <<<===#######################
        
        CLoseAll()            // Закрытие всех баз данных с ожиданием завершения операций
        
*       aDir := Directory("*START_AIDOS-X*.exe")

        mNStartAidos = ADIR("*START_AIDOS-X*.exe")
        PRIVATE aFileName[mNStartAidos], aFileSize[mNStartAidos], aFileDate[mNStartAidos], aFileTime[mNStartAidos]
        ADIR("*START_AIDOS-X*.exe", aFileName, aFileSize, aFileDate, aFileTime)

*       LB_Warning(aFileName, 'Эксперименты с "BigData.dbf"')
        
        aStructure := { { 'File_Num ', "C",  8, 0 }, ;
                        { 'File_Name', "C", 40, 0 }, ;        // ___START_AIDOS-X_2021_10_26.exe
                        { 'File_Size', "N", 10, 0 }, ;
                        { 'File_Date', "D",  8, 0 }, ;
                        { 'File_Time', "C",  8, 0 }, ;
                        { 'Delete   ', "C",  1, 0 }  }
*       DbCreate( "StartAidos.dbf", aStructure, "DBFNTX" )   // ALL NB !!!
        DbCreate( "StartAidos", aStructure )                 // ALL NB !!!
        
*       USE ("StartAidos.dbf") NEW SHARED ALIAS "START_AIDOS"
        USE StartAidos EXCLUSIVE NEW
        
        IF LEN(aFileName) > 0

*          FOR j := 1 TO Len(aDir)
*              APPEND BLANK
*              REPLACE File_Num  WITH ALLTRIM(STR(j))
*              REPLACE File_Name WITH aDir[j,F_NAME]       
*              REPLACE File_Size WITH aDir[j,F_SIZE]       
*              REPLACE File_Date WITH DTOS(aDir[j,F_WRITE_DATE])
*              REPLACE File_Time WITH aDir[j,F_WRITE_TIME]
*              REPLACE Delete    WITH 'Y'
*          NEXT

           FOR j := 1 TO Len(aFileName)
              APPEND BLANK
              REPLACE File_Num  WITH ALLTRIM(STR(j))
              REPLACE File_Name WITH aFileName[j]       
              REPLACE File_Size WITH aFileSize[j]       
              REPLACE File_Date WITH aFileDate[j]
              REPLACE File_Time WITH aFileTime[j]
              REPLACE Delete    WITH 'Y'
           NEXT
           
           INDEX ON DTOS(File_Date)+File_Time TO StartAidos
           
           DBGOBOTTOM()
           REPLACE Delete WITH 'N'
           mFileName = ALLTRIM(File_Name)
           
           MsgBox(mFileName)
           
           DBGOTOP()
           DO WHILE .NOT. EOF()
              IF Delete = 'Y'
                 ERASE(File_Name)
              ENDIF
              DBSKIP(1)
           ENDDO
           
           CLoseAll()            // Закрытие всех баз данных с ожиданием завершения операций
           IF mFileName <> "___START_AIDOS-X.exe"
              ADS_CopyFile(mFileName, '___START_AIDOS-X.exe', .F., .T.)   // Скопировать новый файл запуска со стандартным именем и удалить новый файл
           ENDIF
        ENDIF
        ******************************************************************************************************************************








        
        
        
        
        
        
        
        
        ******************************************
        
        CLOSE ALL
        
        oSay97:SetCaption(oSay97:caption)
        oButton:SetCaption('&Ok')          // Деструктурирование окна отображения графического Progress-bar
        oButton:activate := {||PostAppEvent(xbeP_Close,,,oDialog)}  //<<<<<< Add This
        DC_AppEvent( @lOk )
*       PostAppEvent(xbeP_Activate,,,DC_GetObject(GetList,'DCGUI_BUTTON_OK'))       // Роджер
        oDialog:Destroy()
        
        aMess := {}
        AADD(aMess, 'База данных: "BigData.dbf" успешно создана')
        LB_Warning(aMess, 'Эксперименты с "BigData.dbf"')
        
        ADS_SERVER_QUIT()
        
        RETURN NIL
        
        ***********************************************************************************************************************

FUNCTION ADS_CopyFile(mFileName1, mFileName2, mDialod, mDelete)    // Копирование файла при ADSDBE ON

      ****** Обработка ошибки ******************

      bError := ErrorBlock( {|e| Break(e)} )           // установить новый кодовый блок обработки ошибок
      BEGIN SEQUENCE                                   // код нормального исполнения

            *** код нормального исполнения
            IF mDialod
               oScr := DC_WaitOn('Копирование файла: '+ALLTRIM(mFileName1)+' ===>>> '+ALLTRIM(mFileName2)+'. Немного подождите!!!',,,,,,,,,,,.F.)
            ENDIF

            CLOSE ALL

            DbeSetDefault("DBFNTX")  // ADS OFF

            COPY FILE (mFileName1) TO (mFileName2)     // <<<===########################## kill
            IF mDelete
               ERASE(mFileName1)
            ENDIF

            DbeSetDefault("ADSDBE")  // ADS ON

            IF mDialod
               DC_Impl(oScr)
            ENDIF

*           IF mDialod
*              aMess := {}
*              AADD(aMess, 'Копирование файла: '+ALLTRIM(mFileName1)+' ===>>> '+ALLTRIM(mFileName2)+' завершено нормально !!!')
*              AADD(aMess, '')
*              LB_Warning(aMess, 'Эксперименты с "BigData.dbf"')
*           ENDIF

            mFlagError = .F.

      RECOVER                                          // код обработки ошибки

            IF mDialod
               DC_Impl(oScr)
               aMess := {}
               AADD(aMess, 'При копировании файла: '+ALLTRIM(mFileName1)+' ===>>> '+ALLTRIM(mFileName2)+' возникла ошибка !!!')
               AADD(aMess, 'С причинами этой ошибки надо разбираться отдельно.')
               AADD(aMess, 'Может быть недостаточно места на диске.')
               LB_Warning(aMess, 'Эксперименты с "BigData.dbf"')
            ENDIF
            mFlagError = .T.
*           EXIT

      ENDSEQUENCE 
      ErrorBlock( bError )                             // переустановить старый кодовый блок
      ******************************************

RETURN(mFlagError)

************************************************************        
FUNCTION LB_Warning( message, ctitle )

    LOCAL aMsg := {}
*    DEFAULT cTitle TO ''
    IF valtype(message) # 'A'
      aadd(aMsg,message)
    ELSE
      aMsg := message
    ENDIF
    IF LEN(ALLTRIM(cTitle)) > 0
       DC_MsgBox(10,10,aMsg,cTitle)
    ELSE
       DC_MsgBox(10,10,aMsg,'Эксперименты с "BigData.dbf"')
    ENDIF

RETURN NIL

***********************************************************************************************************************

***********************************************************************************************************
****** Графический прогресс-бар (на основе примера XSample_14() xdemo.exe)
***********************************************************************************************************
FUNCTION Time_Progress(Time_Progress, Wsego, oProgress, lOk )

    LOCAL nMaxCount := Wsego
    xtime     = Time_Progress

    ** Отображение занимает очень много времени, поэтому показывать прогресс не чаще чем через 0.1 секунды (как в PercTimeVisio())

    T2tp = (DOY(DATE())-1)*86400+SECONDS()          // Текущее время
    IF T2tp - T1tp > 0.1 .OR. xtime = Wsego         // Время в секундах или 100%

*      aSay[mPTVnumb]:SetCaption(mPTVmess+' '+ALLTRIM(STR(mNumPP/Wsego*100,15,7))+'%')

       *** Индикация времени исполнения

       ***** Процесс может идти больше суток, поэтому для определения
       ***** во всех случаях вычисляется время, прошедшее с начала года
*      T_Mess1 = "Начало:"+" "+TIME()           // Начало

       ***** Прошло секунд с начала процесса
       PUBLIC T_Mess2 := "ch:mi:se"
       Sec_2   = (DOY(DATE())-1)*86400+SECONDS() - Sec_1
       ch2 = INT(Sec_2/3600)                    // Часы
       mm2 = INT(Sec_2/60)-ch2*60               // Минуты
       cc2 = Sec_2-ch2*3600-mm2*60              // Секунды
       T_Mess2 = "Прошло:"+" "+ALLTRIM(STRTRAN(T_Mess2,"ch",STR(ch2,19)))
       T_Mess2 = STRTRAN(T_Mess2,"mi",STRTRAN(STR(mm2,2)," ","0"))
       T_Mess2 = STRTRAN(T_Mess2,"se",STRTRAN(STR(cc2,2)," ","0"))
       *@19,2 SAY T_Mess2+" всего: "+ALLTRIM(STR(Sec_2,17))+" сек."

       PUBLIC T_Mess3 := "ch:mi:se"             // Осталось
       Sec_3 = Sec_2*Wsego/xtime                // Прогн.длит.исп. в секундах
       ch3 = INT(Sec_3/3600)                    // Часы
       mm3 = INT(Sec_3/60)-ch3*60               // Минуты
       cc3 = Sec_3-ch3*3600-mm3*60              // Секунды
       T_Mess3 = ALLTRIM(STRTRAN(T_Mess3,"ch",STR(ch3,19)))
       T_Mess3 = STRTRAN(T_Mess3,"mi",STRTRAN(STR(mm3,2)," ","0"))
       T_Mess3 = STRTRAN(T_Mess3,"se",STRTRAN(STR(cc3,2)," ","0"))
       *@20,2 SAY T_Mess3+" всего: "+ALLTRIM(STR(Sec_3,17))+" сек."

       PUBLIC T_Mess4 := "ch:mi:se"             // Окончание
       Sec_4 = Sec_1 + Sec_3 - (DOY(DATE())-1)*86400
       ch4 = INT(Sec_4/3600)                    // Часы
       mm4 = INT(Sec_4/60)-ch4*60               // Минуты
       cc4 = Sec_4-ch4*3600-mm4*60              // Секунды
       T_Mess4 = "Окончание:"+" "+ALLTRIM(STRTRAN(T_Mess4,"ch",STR(ch4,19)))
       T_Mess4 = STRTRAN(T_Mess4,"mi",STRTRAN(STR(mm4,2)," ","0"))
       T_Mess4 = STRTRAN(T_Mess4,"se",STRTRAN(STR(cc4,2)," ","0"))
       *@21,2 SAY T_Mess4+" всего: "+ALLTRIM(STR(Sec_4,17L())+" сек.с нач.суток")

       PUBLIC T_Mess5 := "Средн.время обработки 1-го объекта: ch:mi:se"
       Sec_5 = Sec_2/xtime
       ch5 = INT(Sec_5/3600)                    // Часы
       mm5 = INT(Sec_5/60)-ch5*60               // Минуты
       cc5 = Sec_5-ch5*3600-mm5*60              // Секунды
       T_Mess5 = ALLTRIM(STRTRAN(T_Mess5,"ch",STR(ch5,19)))
       T_Mess5 = STRTRAN(T_Mess5,"mi",STRTRAN(STR(mm5,2)," ","0"))
       T_Mess5 = STRTRAN(T_Mess5,"se",STRTRAN(STR(cc5,2)," ","0"))
       *@22,2 SAY T_Mess5+" всего: "+ALLTRIM(STR(Sec_5,17))+" сек."

       PUBLIC T_Mess6 := "ch:mi:se"             // Осталось
       Sec_6 = Sec_3 - Sec_2
       ch6 = INT(Sec_6/3600)                    // Часы
       mm6 = INT(Sec_6/60)-ch6*60               // Минуты
       cc6 = Sec_6-ch6*3600-mm6*60              // Секунды
       T_Mess6 = "Осталось:"+" "+ALLTRIM(STRTRAN(T_Mess6,"ch",STR(ch6,19)))
       T_Mess6 = STRTRAN(T_Mess6,"mi",STRTRAN(STR(mm6,2)," ","0"))
       T_Mess6 = STRTRAN(T_Mess6,"se",STRTRAN(STR(cc6,2)," ","0"))
       *@23,2 SAY T_Mess6+" всего: "+ALLTRIM(STR(Sec_6,17))+" сек."

       Mess98 = T_Mess1+SPACE(142-LEN(T_Mess1)-LEN(T_Mess4))+T_Mess4  // Начало, окончание (прогноз) 145
       oSay98:SetCaption(Mess98);oSay98:SetCaption(oSay98:caption)

       Mess99 = T_Mess2+SPACE(144-LEN(T_Mess2)-LEN(T_Mess6))+T_Mess6  // Прошло, осталось (прогноз)  146
       oSay99:SetCaption(Mess99);oSay99:SetCaption(oSay99:caption)

       DC_GetProgress( oProgress, Time_Progress, Wsego )              // Отображение графического Progress-bar

*      Sec_1   // Начало
*      Sec_4   // Окончание
*      Sec_2   // Прошло секунд с начала процесса
*      Sec_6   // Осталось секунд до окончания

*      mTimeProgress=ROUND(Sec_2/(Sec_2+Sec_6)*100,0)
*      DC_GetProgress( oProgress, mTimeProgress, 100 )                // Отображение графического Progress-bar

*      DC_GetProgress( oProgress, ROUND(Sec_2,0), ROUND(Sec_2+Sec_6,0) )                // Отображение графического Progress-bar

*      MsgBox(STR(ROUND(Sec_2,0))+STR(ROUND(Sec_2+Sec_6,0)))
*      MsgBox(STR(mTimeProgress))
*      MILLISEC(1000)

*      K=100/Wsego;mTimeProgress=ROUND(K*Time_Progress,0)
*      DC_GetProgress( oProgress, mTimeProgress, 100 )                // Отображение графического Progress-bar

       DC_AppEvent( @lOk, 0, .01 )

       T1tp = T2tp
    ENDIF

RETURN lOk

***************************************************************************
***************************************************************************
*==================================
* CONTENTS: ADS SERVER PROGRAMS
*==================================
* PROCEDURE DBESYS()
* FUNCTION ADS_SERVER_START()
* FUNCTION ADS_SERVER_QUIT()
* FUNCTION ADS_SERVER_TIP(oSession)

***************************************************************************
FUNCTION ADS_SERVER_START()
***************************************************************************

  PUBLIC oSession := NIL
  PUBLIC cServerTip := ""
  PUBLIC Server_DRIVE := "C:"
 // connect to the ADS server
  oSession := dacSession():New( "ADSDBE", Server_DRIVE )

  cr:=chr(13)

  IF ( oSession:isConnected() ) = .T.

       cServerTip := ADS_SERVER_TIP(oSession)
       // test message only
       confirmbox(,"Connecting to server "+cServerTip         +cr+;
                   "to location: server drajv "+Server_DRIVE  +cr+;
                   " "                                        +cr+;
                   "Advantage Database Server is ON"          +cr+;
                   " "                                        ,;
                   "SERVER: connection OK",;
                 XBPMB_OK,XBPMB_INFORMATION,XBPMB_SYSMODAL)

  ELSE  // Konekcija nije uspela obavezno izdaj poruku!
        // Connection failed be sure to issue a message!

       cServerTip := ADS_SERVER_TIP(oSession)
       // issue a message
       error := var2char(oSession:getLastError())
       confirmbox(,"Connecting to server "+cServerTip           +cr+;
                   "to location: server drajv "+Server_DRIVE    +cr+;
                   " "                                          +cr+;
                   "Advantage Database Server is OFF"           +cr+;
                   " "                                          +cr+;
                   "Server connection Error: "+error            +cr+;
                   " "                                          ,;
                   "SERVER: connection Error",;
                   XBPMB_OK,XBPMB_CRITICAL,XBPMB_SYSMODAL)
      ******
       QUIT
      ******

  ENDIF
RETURN NIL



***************************************************************************
FUNCTION ADS_SERVER_QUIT()
***************************************************************************
 // disconnect from the ADS
 cServerTip := ADS_SERVER_TIP(oSession)
 **********************
 oSession:disconnect()
 **********************

 cr:=chr(13)

 confirmbox(,"Disconnecting from server "+cServerTip     +cr+;
             "to location: server drajv "+Server_DRIVE   +cr+;
             " "                                         +cr+;
             "Advantage Database Server is OFF"          +cr+;
             " "                                         ,;
             "SERVER: diskonnection OK",;
             XBPMB_OK,XBPMB_INFORMATION,XBPMB_SYSMODAL )
RETURN NIL


***************************************************************************
FUNCTION ADS_SERVER_TIP(oSession)
***************************************************************************
nServerType := oSession:setProperty( ADSDBE_SERVER_TYPE )

IF nServerType == ADSDBE_LOCAL .OR. nServerType == 0
    RETURN "::LOCAL SERVER"
ELSE
    RETURN "::REMOTE SERVER"
ENDIF
RETURN "::STOP SERVER"

******************************************************************************************
Function CLoseAll()            // Закрытие всех баз данных с ожиданием завершения операций
******************************************************************************************
LOCAL bError , aWorkareas , x, y

bError := ErrorBlock( {|e| Break(e)} )
aWorkAreas := workspacelist()
y := len(aWorkAreas)

for x = 1 to y
  BEGIN SEQUENCE
    (aWorkAreas[x])->(DbClearRelation())
    (aWorkAreas[x])->(DbCloseArea())
  ENDSEQUENCE
next
ErrorBlock(bError)
bError   := nil
Return nil
******************************************************************************************
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS

Beitrag von Werner_Bayern »

Servus Joachim,

das wäre SET COLLATION TO SYSTEM, ändert aber auch nichts. Ja, im DA werden die Umlaute korrekt angezeigt, der frägt mich auch ganz brav:
test.PNG
test.PNG (15.57 KiB) 4778 mal betrachtet
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten