Beheben von Problemen bei der Migration einer Anwendung unter ADS
Moderator: Moderatoren
- Eugeny Lutsenko
- 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
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
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
- nightcrawler
- 1000 working lines a day
- Beiträge: 651
- 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
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.
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.
- Eugeny Lutsenko
- 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
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.
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
******************************************************************************************
- Eugeny Lutsenko
- 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
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 (62.38 KiB) 5262 mal betrachtet
- nightcrawler
- 1000 working lines a day
- Beiträge: 651
- 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
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.
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.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS
Sind die ADSDBE.DLL und die ACE32.DLL passend zur eingesetzten Xbase++- und ADS-Version?
Herzlich,
Tom
Tom
- Eugeny Lutsenko
- 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
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
- HaPe
- 1000 working lines a day
- Beiträge: 996
- 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
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 ...
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
Hans-Peter
- Eugeny Lutsenko
- 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
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.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 ...
- nightcrawler
- 1000 working lines a day
- Beiträge: 651
- 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
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
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
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS
In der Hilfe zur ADSDBE ist ebenfalls aufgelistet, welche Funktionen in Indexausdrücken verwendet werden dürfen und welche nicht.
Herzlich,
Tom
Tom
- Eugeny Lutsenko
- 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
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:
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:
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 <<<===################################
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")
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2517
- 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
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
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
Gruss Carlo
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2126
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS
Hallo Eugeny,
wie hast Du es geschafft, einen connect zu einem ADS ohne ADS-Server zu bekommen? Bei mir funktioniert das nicht:
Wie schaut Deine ads.ini aus?
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
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2126
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS
Hat sich erledigt, bin bei Pablo fündig geworden, es muss die adsloc32.dll gefunden werden.
edit: Sorry, Roger, nicht Pablo
edit: Sorry, Roger, nicht Pablo
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!>
Werner
<when the music is over, turn off the lights!>
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2517
- 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
Ja, und das Config File für den Local Server heisst anderes: adslocal.cfg
siehe u.A.: https://devzone.advantagedatabase.com/d ... ration.htm
siehe u.A.: https://devzone.advantagedatabase.com/d ... ration.htm
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2126
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS
Danke Carlo,
dann wird die ads.ini da nicht berücksichtigt, ist also nicht nötig?
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!>
Werner
<when the music is over, turn off the lights!>
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2517
- 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
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.
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
Gruss Carlo
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2126
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS
Servus Carlo,
hab ich gemacht:
Aber Umlaute passen nicht. Hab
und DBF/NTX, also OEM.
Woran fehlts?
hab ich gemacht:
Code: Alles auswählen
[SETTINGS]
ANSI_CHAR_SET=GERMAN
OEM_CHAR_SET=GERMAN
Code: Alles auswählen
SET CHARSET TO ansi
Woran fehlts?
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- nightcrawler
- 1000 working lines a day
- Beiträge: 651
- 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
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
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
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2517
- 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
Entschuldige: Als ich das Ding noch benutzt hatte ging das immer mit dem Connect-String etwa so: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?
Code: Alles auswählen
oADS := DacSession():New("DBE=ADSDBE;SERVER=D:;ADS_LOCAL_SERVER")
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2126
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS
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:
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:
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- nightcrawler
- 1000 working lines a day
- Beiträge: 651
- 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
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.ä.
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.ä.
- Eugeny Lutsenko
- 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
ADS.INI: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
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
******************************************************************************************
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2126
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Beheben von Problemen bei der Migration einer Anwendung unter ADS
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:
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:
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>