Автор | Сообщение |
|
| |
Пост N: 94
Зарегистрирован: 14.01.09
|
|
Отправлено: 06.04.20 12:18. Заголовок: работа через sql драйвер
Привет. Я надолго откололся от харборно-клипперных берегов, помогите сориентироваться на местности, пожалуйста. Есть ои в харборе сретства, чтобы переместить таблицы из DBF в sql сервер? то есть, чтобы вместо dbf файлов использовались таблицы sql . Без изменения синтаксиса программы, перекомпилировать с каким-то драйвером и пользоваться механизмами поддержания целостности, бакапа и прочими прелестями от sql сервера.
|
|
|
Ответов - 17
[только новые]
|
|
|
| |
Пост N: 1534
Зарегистрирован: 20.02.11
|
|
Отправлено: 06.04.20 15:04. Заголовок: без изменения синтак..
без изменения синтаксиса - нет. С минимальным изменением - ADS (платный или ломаный ) с любым бесплатным sql = все переписывать
|
|
|
|
| |
Пост N: 95
Зарегистрирован: 14.01.09
|
|
Отправлено: 06.04.20 15:49. Заголовок: жалко. Было бы интер..
жалко. Было бы интересно, пользоваться синтаксисом Клиппера и движком sql сервера.
|
|
|
|
| |
Пост N: 1535
Зарегистрирован: 20.02.11
|
|
Отправлено: 06.04.20 15:59. Заголовок: dimao пишет: Было б..
dimao пишет: это ADS. Немного обыграть команду USE и в целом готово. Бесплатно adslocal, но он сильно уступает северной в производительности и надёжности. Платная северная слишком дорога. На версию 10 ключи по всему интернету валяются. Последняя 12 вышла сразу после покупки ADS SAP вроде в 2014. С тех пор обновлёний нет.
|
|
|
|
| постоянный участник
|
Пост N: 3112
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.04.20 18:56. Заголовок: dimao пишет Было бы ..
dimao пишет цитата: | Было бы интересно, пользоваться синтаксисом Клиппера и движком sql сервера. |
| Это каким образом ? Пример MiniGui\SAMPLES\BASIC\MYSQL\demo_2.prg (кусочек на классе Class TMySQLServer) Скрытый текст
*--------------------------------------------------------------* Function Grid_fill() *--------------------------------------------------------------* Local cSearch:= ' "'+Upper(AllTrim(Grid_Names.cSearch.Value ))+'%" ' Local nCounter:= 0 Local oRow Local i Local oQuery Local GridMax:= iif(len(cSearch)== 0, 30, 1000000) DELETE ITEM ALL FROM Grid_1 Of Grid_Names oQuery := oServer:Query( "Select Code, Name From NAMES WHERE NAME LIKE "+cSearch+" Order By Name" ) If oQuery:NetErr() MsgInfo("SQL SELECT error: " + oQuery:Error()) RELEASE WINDOW ALL Quit Endif For i := 1 To oQuery:LastRec() nCounter++ If nCounter == GridMax Exit Endif oRow := oQuery:GetRow(i) ADD ITEM { Str(oRow:fieldGet(1), 8), oRow:fieldGet(2) } TO Grid_1 Of Grid_Names oQuery:Skip(1) Next oQuery:Destroy() Grid_Names.cSearch.SetFocus Return Nil
| Пример MiniGui\SAMPLES\Advanced\Tsb_sqlite\demo.prg (тоже кусочек) Скрытый текст
*--------------------------------------------------------* FUNCTION BrowseTable(cTable, mod) *--------------------------------------------------------* Local cSelect, bSetup , oBrw Local nWinWidth := getdesktopwidth() * 0.8 Local nWinHeight := getdesktopheight() * 0.8 Local cTitle := "Table: " + cTable if mod == 1 cSelect := "SELECT * FROM " + cTable DBUSEAREA( .T.,, cSelect, "TABLE" ,,, "UTF8") Select TABLE ... *--------------------------------------------------------* Function SqlUpdate(uVal, nCol, cTable, lApp) *--------------------------------------------------------* Local cQuery, i, cFldName, nStart, cQuery2 Local aDbStru := dbstruct() if lApp cQuery:= "INSERT INTO "+cTable+" ( " cQuery2:= " ) values ( " for i := 1 to len(aDbStru) cFldName := aDbStru[i, 1] if i > 1 cQuery += " , " cQuery2 += " , " endif cQuery += cFldName cQuery2 += c2sql(&cFldName) next cQuery += cQuery2 + " )" else nStart := if(nCol==1,2,1) cFldName := aDbStru[nCol, 1] cQuery := "UPDATE "+cTable+" SET " + cFldName + " = " + c2sql(&cFldName) + " WHERE " for i := 1 to len(aDbStru) if i != nCol cFldName := aDbStru[i, 1] if i > nStart cQuery += " AND " endif cQuery += cFldName + " = "+ c2sql(&cFldName) endif next cQuery += " " endif If ! RDDINFO(RDDI_EXECUTE, cQuery ) MsgStop("Can't update record in table "+cTable+" !", "Error") Return .F. EndIf Return .T. *--------------------------------------------------------* Function SqlDelete(cTable ) *--------------------------------------------------------* Local cQuery, i, cFldName Local aDbStru := dbstruct() cQuery := "DELETE FROM "+cTable+ " WHERE " for i := 1 to len(aDbStru) cFldName := aDbStru[i, 1] if i > 1 cQuery += " AND " endif cQuery += cFldName + " = "+ c2sql(&cFldName) next cQuery += " " If ! RDDINFO(RDDI_EXECUTE, cQuery ) MsgStop("Can't Delete record in table "+cTable+" !", "Error") Return .F. EndIf Return .T. *--------------------------------------------------------* FUNCTION CreatefromDBF(cSbase, cDBase ) *--------------------------------------------------------* LOCAL cHeader, cQuery := "", NrReg:= 0, cTable := cFileNoExt(cDBase) LOCAL lCreateIfNotExist := .t., cOldRdd, db, lRet := .f. IF !FILE( hb_dirBase()+cDBase+".dbf" ) RETURN .f. endif cTable := cDBase db := sqlite3_open( cSbase, lCreateIfNotExist ) IF !DB_IS_OPEN( db ) MsgStop( "Can't open/create " + cSbase, "Error" ) Return .f. endif sqlite3_exec( db, "PRAGMA auto_vacuum=0" ) * Create table IF ( RDDSETDEFAULT() != "DBFNTX" ) cOldRdd := RDDSETDEFAULT( "DBFNTX" ) ENDIF DBUSEAREA(.T.,'DBFNTX',cTable) cHeader := QueryCrea(cTable,0) IF sqlite3_exec( db, cHeader ) == SQLITE_OK go top Do While !Eof() cQuery += QueryCrea(cTable,1) NrReg++ skip EndDo use IF sqlite3_exec( db, ; "BEGIN TRANSACTION;" + ; cQuery + ; "COMMIT;" ) == SQLITE_OK MsgInfo( AllTrim(Str(NrReg))+" records added to table "+cTable, "Result" ) lRet := .t. ENDIF ENDIF RDDSETDEFAULT( cOldRdd ) RETURN .t.
| и т.д. по серверам Haz цитата: | без изменения синтаксиса - нет. С минимальным изменением - ADS (платный или ломаный ) с любым бесплатным sql = все переписывать |
|
|
|
|
|
| постоянный участник
|
Пост N: 3113
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.04.20 19:13. Заголовок: PS Сервер LetoDb =..
PS Сервер LetoDb => LetoDbf => сервера работы с dbf файлами, например тут http://clipper.borda.ru/?1-7-0-00000042-000-0-0-1544163593 Кусочек leto_std.ch ... #xtranslate DBEVAL( [<x,...>] ) => LETO_DBEVAL( <x> ) #command REPLACE [<f1> WITH <x1> [, <fN> WITH <xN>]] ; [FOR <for>] [WHILE <while>] [NEXT <next>] ; [RECORD <rec>] [<rest:REST>] [ALL] [<descend:DESC,DESCENDING>] => ; leto_dbEval( "{|| FIELDPUT('"+<"f1">+"',"+<"x1">+")"[+", FIELDPUT('"+<"fN">+"',"+<"xN">+")"]+" }", ; { <{for}>, <"for"> }, { <{while}>, <"while"> }, <next>, <rec>, <.rest.>,, .T., <.descend.>, .F. ) #command REPLACE <f1> WITH <v1>[, <fN> WITH <vN>] => ; _FIELD-><f1> := <v1> [; _FIELD-><fN> := <vN>] #command DELETE [FOR <for>] [WHILE <while>] [NEXT <next>] ; [RECORD <rec>] [<rest:REST>] [ALL] [<descend:DESC,DESCENDING>] [INTO <v>] => ; [ <v> := ]; leto_dbEval( "{|n| dbDelete(), n }", { <{for}>, <"for"> }, { <{while}>, <"while"> }, <next>, <rec>, <.rest.>,, .T., <.descend.>, .F. ) #command DELETE => dbDelete() #command RECALL [FOR <for>] [WHILE <while>] [NEXT <next>] ; [RECORD <rec>] [<rest:REST>] [ALL] [<descend:DESC,DESCENDING>] [INTO <v>] => ; [ <v> := ]; leto_dbEval( "{|n| dbRecall(), n }", { <{for}>, <"for"> }, { <{while}>, <"while"> }, <next>, <rec>, <.rest.>,, .T., <.descend.>, .T. ) #command RECALL => dbRecall() #command COUNT [[INTO][TO] <v>] ; [FOR <for>] [WHILE <while>] [NEXT <next>] ; [RECORD <rec>] [<rest:REST>] [ALL] [<descend:DESC,DESCENDING>] => ; [ <v> := ]; leto_dbEval( "{|n| n }", { <{for}>, <"for"> }, { <{while}>, <"while"> }, <next>, <rec>, <.rest.>,, .F., <.descend.> ) ... Тут синтаксис clpper, но не sql движок
|
|
|
|
| постоянный участник
|
Пост N: 6610
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.04.20 17:22. Заголовок: dimao пишет: Есть о..
dimao пишет: цитата: | Есть ои в харборе сретства, чтобы переместить таблицы из DBF в sql сервер? то есть, чтобы вместо dbf файлов использовались таблицы sql . Без изменения синтаксиса программы |
| ЛетоДБ можно ставить и не заморачиваться ни с какими таблицами sql, если нужно остаться на синтаксисе Клипера. Скорость и простота просто поражает - https://abonent4.ru/letodb/ Всё остальное в любом случае нужно переписывать.
|
|
|
|
| |
Пост N: 1
Зарегистрирован: 11.04.20
|
|
Отправлено: 11.04.20 06:19. Заголовок: ЛетоДБ можно ставить
Andrey, добрый день. Посоветуйте, пожалуйста, с чего начать, чтобы получить такой же интерфейс, как у программ на сайте abonent4.ru. Опыт - Clipper.
|
|
|
|
| постоянный участник
|
Пост N: 6611
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.04.20 16:42. Заголовок: AlexeyD пишет: Посо..
AlexeyD пишет: цитата: | Посоветуйте, пожалуйста, с чего начать |
| Это МиниГуи ! Таблицы - tsbrowse. Смотреть в соседней ветке этого форума. Куча примеров для пробы и понятия как это работает. Помочь в освоении помогут здесь же на форуме.
|
|
|
|
| |
Пост N: 1540
Зарегистрирован: 20.02.11
|
|
Отправлено: 11.04.20 17:48. Заголовок: AlexeyD пишет: Посо..
AlexeyD пишет: цитата: | Посоветуйте, пожалуйста, с чего начать, |
| Дополню Андрея. По ссылкам с форума установить Minigui. Это Gui одежка на Harbour. Установить компилятор borland, можно тот-же bcc55. Разобраться с настрой путей и просто просмотреть все примеры из поставки МиниГуи. Далее выбрать свой самый простой проект на clipper и понемногу реализовать в Gui.
|
|
|
|
| постоянный участник
|
Пост N: 6612
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.04.20 18:20. Заголовок: Посмотри ещё https:/..
Посмотри ещё https://abonent4.ru/minigui/ Там есть инструкции. Таблицы смотри пример - Tsb_composite(1.8) работа с объектом Tsbrowse IDE не пользуюсь, уже привык без него, т.е. формы создаю кодом.
|
|
|
|
| |
Пост N: 242
Зарегистрирован: 05.11.05
|
|
Отправлено: 12.04.20 08:24. Заголовок: Haz пишет: можно то..
Haz пишет: А он с новыми версиями минигуи работает? Они же теперь под bcc58.
|
|
|
|
|
| постоянный участник
|
Пост N: 3119
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.04.20 09:34. Заголовок: rvu пишет А он с нов..
rvu пишет цитата: | А он с новыми версиями минигуи работает? Они же теперь под bcc58. |
| Сделал в последних версиях hmg C:\MiniGuiBcc58\BATCH\MiniGui.cfg такой # Basic configuration for Compile.bat MG_CMP=harbour MG_BCC=c:\borland\bcc55 MG_ROOT=c:\miniguiBcc58 Примеры c TsBrowse собираются и работают. Попробуйте
|
|
|
|
| |
Пост N: 243
Зарегистрирован: 05.11.05
|
|
Отправлено: 12.04.20 11:36. Заголовок: А в чем был смысл пе..
А в чем был смысл перехода на Bcc58? Кстати, я пытаюсь перейти на Embarcadero C++ 10.1 Berlin compiler, вот в этом вижу смысл, но не все программы пока что смог там откомпилировать.
|
|
|
|
| moderator
|
Пост N: 1668
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.04.20 14:57. Заголовок: rvu пишет: в чем бы..
rvu пишет: цитата: | в чем был смысл перехода на Bcc58? |
| Причина перехода простая: BCC 5.5 была выпущена в 2000 году, еще до выхода Windows XP BCC 5.8 была выпущена в 2006 году, еще до выхода Windows Vista Embarcadero C++ 10.1 была выпущена в 2016 году
|
|
|
|
| |
Пост N: 244
Зарегистрирован: 05.11.05
|
|
Отправлено: 12.04.20 18:06. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Embarcadero C++ 10.1 была выпущена в 2016 году |
| Кстати, они сейчас раздают The Embarcadero 10.2 Tokyo C++ compiler.
|
|
|
|
| |
Пост N: 2
Зарегистрирован: 11.04.20
|
|
Отправлено: 12.04.20 19:42. Заголовок: Это МиниГуи !
Спасибо.
|
|
|
|
| moderator
|
Пост N: 1669
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.04.20 19:53. Заголовок: rvu пишет: они сейч..
rvu пишет: цитата: | они сейчас раздают The Embarcadero 10.2 |
| Благодарю за сообщение! Уже обновился - полет нормальный
|
|
|
|