Всем кому это интересно Стали доступны исходники известной библиотеки SQLRDD для
xXарбора, которая раньше была платной.
Сейчас адаптирую для работы с Минигуи эту библиотеку, которая позволяет портировать синтаксис
Харбора без всяких изменений для работы с серверами MySQL, Postgres, Firebird, Oracle, MS SQL.
Подготовил для сравнения две программы - одна использует SQLRDD для доступа к таблице на сервере MySQL, а другая использует для доступа к DBF драйвер DBFCDX.
Код первой программы ниже
#include "minigui.ch"
#include "sqlrdd.ch"
REQUEST SQLRDD
REQUEST SR_MYSQL
// NOTE: the database must exist before runnning the test.
#define SERVER "localhost"
#define UID "root"
#define PWD "mypass"
#define DTB "test"
*--------------------------------------------------------*
FUNCTION Main()
*--------------------------------------------------------*
LOCAL nConnection
rddSetDefault( "SQLRDD" )
nConnection := sr_AddConnection( CONNECT_MYSQL, "MySQL=" + SERVER + ";UID=" + UID + ";PWD=" + PWD + ";DTB=" + DTB )
IF nConnection < 0
Alert( "Connection error. See sqlerror.log for details." )
RETURN NIL
ELSE
//Alert( "Connected to : " + SR_GetConnectionInfo(, SQL_DBMS_NAME ) + " " + SR_GetConnectionInfo(, SQL_DBMS_VER ) )
ENDIF
DEFINE WINDOW Form_1 ;
WIDTH 640 HEIGHT 480 ;
TITLE 'SQLRDD Demo' ;
MAIN NOMAXIMIZE ;
ON INIT OpenTable() ;
ON RELEASE CloseTable()
DEFINE MAIN MENU
DEFINE POPUP 'Test'
MENUITEM 'Add record' ACTION AddRecord( 'ARG', 'Argentina', 38740000 )
SEPARATOR
ITEM "Exit" ACTION ThisWindow.Release()
END POPUP
END MENU
@ 10, 10 BROWSE Browse_1 ;
WIDTH 610 ;
HEIGHT 390 ;
HEADERS { 'Code', 'Name', 'Residents' } ;
WIDTHS { 50, 160, 100 } ;
WORKAREA country ;
FIELDS { 'Code', 'Name', 'Residents' } ;
JUSTIFY { BROWSE_JTFY_LEFT, BROWSE_JTFY_LEFT, BROWSE_JTFY_RIGHT } ;
EDIT ;
INPLACE ;
READONLY { .T., .F., .F. }
END WINDOW
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
RETURN NIL
*--------------------------------------------------------*
PROCEDURE OpenTable
*--------------------------------------------------------*
Form_1.Browse_1.VISIBLE := .F.
CreateTable()
INDEX ON FIELD->RESIDENTS TAG residents TO country
GO TOP
Form_1.Browse_1.VISIBLE := .T.
RETURN
*--------------------------------------------------------*
PROCEDURE CloseTable
*--------------------------------------------------------*
dbCloseArea( "country" )
RETURN
*--------------------------------------------------------*
FUNCTION CreateTable
*--------------------------------------------------------*
LOCAL aStruct := { ;
{ "CODE", "C", 3, 0 }, ;
{ "NAME", "C", 50, 0 }, ;
{ "RESIDENTS", "N", 11, 0 } ;
}
IF sr_file( "country" )
sr_DropTable( "country" )
sr_DropIndex( "country" )
ENDIF
dbCreate( "country", aStruct, "SQLRDD" )
USE country /*EXCLUSIVE*/ VIA "SQLRDD"
dbAppend()
REPLACE CODE WITH 'LTU', NAME WITH 'Lithuania', RESIDENTS WITH 3369600
dbAppend()
REPLACE CODE WITH 'USA', NAME WITH 'United States of America', RESIDENTS WITH 305397000
dbAppend()
REPLACE CODE WITH 'POR', NAME WITH 'Portugal', RESIDENTS WITH 10617600
dbAppend()
REPLACE CODE WITH 'POL', NAME WITH 'Poland', RESIDENTS WITH 38115967
dbAppend()
REPLACE CODE WITH 'AUS', NAME WITH 'Australia', RESIDENTS WITH 21446187
dbAppend()
REPLACE CODE WITH 'FRA', NAME WITH 'France', RESIDENTS WITH 64473140
dbAppend()
REPLACE CODE WITH 'RUS', NAME WITH 'Russia', RESIDENTS WITH 141900000
RETURN NIL
*--------------------------------------------------------*
PROCEDURE AddRecord( cCode, cName, nResidents )
*--------------------------------------------------------*
APPEND BLANK
REPLACE CODE WITH cCode, ;
NAME WITH cName, ;
RESIDENTS WITH nResidents
dbUnlock() // Recno() is valid only after UNLOCK or COMMIT
Form_1.Browse_1.VALUE := country->( RecNo() )
Form_1.Browse_1.Refresh
RETURN
и для сравнения код второй программы:
#include "minigui.ch"
REQUEST DBFCDX
*--------------------------------------------------------*
FUNCTION Main()
*--------------------------------------------------------*
rddSetDefault( "DBFCDX" )
DEFINE WINDOW Form_1 ;
WIDTH 640 HEIGHT 480 ;
TITLE 'DBFCDX Demo' ;
MAIN NOMAXIMIZE ;
ON INIT OpenTable() ;
ON RELEASE CloseTable()
DEFINE MAIN MENU
DEFINE POPUP 'Test'
MENUITEM 'Add record' ACTION AddRecord( 'ARG', 'Argentina', 38740000 )
SEPARATOR
ITEM "Exit" ACTION ThisWindow.Release()
END POPUP
END MENU
@ 10, 10 BROWSE Browse_1 ;
WIDTH 610 ;
HEIGHT 390 ;
HEADERS { 'Code', 'Name', 'Residents' } ;
WIDTHS { 50, 160, 100 } ;
WORKAREA country ;
FIELDS { 'Code', 'Name', 'Residents' } ;
JUSTIFY { BROWSE_JTFY_LEFT, BROWSE_JTFY_LEFT, BROWSE_JTFY_RIGHT } ;
EDIT ;
INPLACE ;
READONLY { .T., .F., .F. }
END WINDOW
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
RETURN NIL
*--------------------------------------------------------*
PROCEDURE OpenTable
*--------------------------------------------------------*
Form_1.Browse_1.VISIBLE := .F.
CreateTable()
INDEX ON FIELD->RESIDENTS TAG residents TO country
GO TOP
Form_1.Browse_1.VISIBLE := .T.
RETURN
*--------------------------------------------------------*
PROCEDURE CloseTable
*--------------------------------------------------------*
dbCloseArea( "country" )
RETURN
*--------------------------------------------------------*
FUNCTION CreateTable
*--------------------------------------------------------*
LOCAL aStruct := { ;
{ "CODE", "C", 3, 0 }, ;
{ "NAME", "C", 50, 0 }, ;
{ "RESIDENTS", "N", 11, 0 } ;
}
IF File( "country.dbf" )
FErase( "country.dbf" )
FErase( "country.cdx" )
ENDIF
dbCreate( "country", aStruct, "DBFCDX" )
USE country /*EXCLUSIVE*/ VIA "DBFCDX"
dbAppend()
REPLACE CODE WITH 'LTU', NAME WITH 'Lithuania', RESIDENTS WITH 3369600
dbAppend()
REPLACE CODE WITH 'USA', NAME WITH 'United States of America', RESIDENTS WITH 305397000
dbAppend()
REPLACE CODE WITH 'POR', NAME WITH 'Portugal', RESIDENTS WITH 10617600
dbAppend()
REPLACE CODE WITH 'POL', NAME WITH 'Poland', RESIDENTS WITH 38115967
dbAppend()
REPLACE CODE WITH 'AUS', NAME WITH 'Australia', RESIDENTS WITH 21446187
dbAppend()
REPLACE CODE WITH 'FRA', NAME WITH 'France', RESIDENTS WITH 64473140
dbAppend()
REPLACE CODE WITH 'RUS', NAME WITH 'Russia', RESIDENTS WITH 141900000
RETURN NIL
*--------------------------------------------------------*
PROCEDURE AddRecord( cCode, cName, nResidents )
*--------------------------------------------------------*
APPEND BLANK
REPLACE CODE WITH cCode, ;
NAME WITH cName, ;
RESIDENTS WITH nResidents
Form_1.Browse_1.VALUE := country->( RecNo() )
Form_1.Browse_1.Refresh
RETURN
Как Вы можете увидеть, различия у этих программ минимальные:
для SQLRDD нужно добавить только подключение к серверу MySQL.
Ваши комментарии на тему актуальности этой библиотеки приветствуются...