As I use MySQL tables I need to do insert-update-deletes. Therefor I need to write the necessary statements, which is always the same and thus becoming boring and possible mistakes can happen quickly. Two sort of statements: Harbour/PRG and PHP.
I wrote this little prg in order to create these statements. Of course you will need a MySQL database in order to have advantage of this program.
Fill in databasename, host, username and password + tablename and there you go!
Have some fun in these dark and uncertain times ! Serge
Code: Select all
#include "hmg.ch"
#DEFINE TRUE .T.
#DEFINE FALSE .F.
#DEFINE true .T.
#DEFINE false .F.
#DEFINE TRUE .T.
#DEFINE FALSE .F.
#DEFINE pON .T.
#DEFINE pOFF .F.
#DEFINE pNULL ""
#DEFINE pMEMO "M"
#DEFINE pDATE "D"
#DEFINE pLOGICAL "L"
#DEFINE pNUMERIC "N"
#DEFINE pCHARACTER "C"
#TRANSLATE VALID_PARM( <X>, <Y>, <Z>) => IF( <X> = NIL, <Z>, IF(VALTYPE(<X>) != <Y>, <Z>, <X>))
FUNCTION MAIN()
/****************/
PUBLIC dbo
PUBLIC qDBN
PUBLIC qHST
PUBLIC qUSR
PUBLIC qPAW
PUBLIC cTABLE
PUBLIC aFLD := {}
PUBLIC aFLD_ORDER := {}
PUBLIC aINDEXES := {}
SET PRINTER TO C:\TEST\DEBUG_CREATE_STATS.TXT
SET PRINTER ON
SET CONSOLE OFF
qDBN := 'DATABASE_NAME'
qHST := 'DATABASE_HOST'
qUSR := 'DATABASE_USER'
qPAW := 'DATABASE_PASSWORD'
cTABLE := 'aTABLE_NAME'
Create_INSERT ( cTABLE)
Create_UPDATE ( cTABLE)
Create_DELETE ( cTABLE)
Create_PHP_INSERT( cTABLE)
Create_PHP_UPDATE( cTABLE)
Create_PHP_DELETE( cTABLE)
SET PRINTER TO
SET PRINTER OFF
SET CONSOLE ON
RETURN
FUNCTION Get_Information_Schema(cTABLE)
/**************************************/
LOCAL cQuery2, cSQL2
cQuery2 := "SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_DEFAULT, EXTRA, COLUMN_KEY " + CRLF
cQuery2 += "FROM information_schema.COLUMNS " + CRLF
cQuery2 += "WHERE TABLE_SCHEMA = '" + qDBN + "' " + CRLF
cQuery2 += "AND TABLE_NAME = '" + cTABLE + "' " + CRLF
cQuery2 += "ORDER BY ORDINAL_POSITION " + CRLF
cSQL2 := cQuery2
cQuery2 := dbo:Query( cQuery2 )
IF cQuery2:NetErr()
? PROCNAME() + '2 ' + cQuery2:Error(), cSQL2
MSGINFO(cQuery2:Error(), 'NOK' )
RETURN
ENDIF
aFLD := {}
aFLD_ORDER := {}
? 'TABLE: ', cTABLE
? REPLICATE('*', LEN(cTABLE) + 8 )
FOR j := 1 To cQuery2:LastRec()
aCurRowj := cQuery2:GetRow(j)
cCOLUMN_NAME := ALLTRIM(aCurRowj:fieldGet(1))
cCOLUMN_TYPE := ALLTRIM(aCurRowj:fieldGet(2))
cCOLUMN_DEFAULT := ALLTRIM(aCurRowj:fieldGet(3))
cEXTRA := ALLTRIM(aCurRowj:fieldGet(4))
cCOLUMN_KEY := ALLTRIM(aCurRowj:fieldGet(5))
? cCOLUMN_NAME, cCOLUMN_TYPE, cCOLUMN_DEFAULT,cEXTRA, cCOLUMN_KEY
AADD(aFLD, {cCOLUMN_NAME, cCOLUMN_TYPE, cCOLUMN_DEFAULT,cEXTRA, cCOLUMN_KEY } )
AADD(aFLD_ORDER, {cCOLUMN_NAME} )
NEXT j
cQuery3 := "SHOW INDEX FROM " + cTABLE + " "
cSQL3 := cQuery3
cQuery3 := dbo:Query( cQuery3 )
IF cQuery3:NetErr()
? PROCNAME() + '2 ' + cQuery3:Error(), cSQL3
MSGINFO('SHOW INDEX_ERROR', 'NOK' )
RETURN
ENDIF
aINDEXES := {}
FOR j := 1 To cQuery3:LastRec()
aCurRowj := cQuery3:GetRow(j)
cNON_UNIQUE := ALLTRIM(Strvalue(aCurRowj:fieldGet(2)))
cKEY_NAME := ALLTRIM(aCurRowj:fieldGet(3))
cCOLUMN_NAME := ALLTRIM(aCurRowj:fieldGet(5))
cINDEX_TYPE := STRVALUE(aCurRowj:fieldGet(11))
cNON_UNIQUE := IIF(cNON_UNIQUE == '0', 'Unique','Non unique')
IF cNON_UNIQUE == 'Unique'
AADD (aINDEXES, cCOLUMN_NAME)
ELSE
IF cINDEX_TYPE == 'Unique'
// AADD (aINDEXES, cINDEX_TYPE)
ENDIF
ENDIF
NEXT j
?
? 'Indexes'
? '*******'
FOR a = 1 to len(aINDEXES)
FOR b = 1 to len(aFLD)
IF aINDEXES [a] == aFLD [b] [1]
aFLD [b] [5] := 'Unique'
EXIT
ENDIF
NEXT
? aFLD [b] [1], aFLD [b] [2],aFLD [b] [3],aFLD [b] [4], aFLD [b] [5]
NEXT
? REPLICATE('=', LEN(cTABLE) + 8 )
?
RETURN
FUNCTION Create_INSERT ( cKEY1)
/******************************/
LOCAL cQuery2, cTXT, cQT1, cQT2, cQT3, a, cVAR
IF EMPTY(qHST) .OR. EMPTY(qUSR) .OR. EMPTY(qPAW) .OR. EMPTY(qDBN) .OR. EMPTY(cKEY1)
MSGINFO('DB EMPTY' ,'NOK' )
RETURN
ENDIF
IF SQL_Connect(qHST, qUSR, qPAW, qDBN) == Nil
MSGINFO('SQL_CONNECT_ERROR' ,'NOK' )
RETURN
ENDIF
Get_Information_Schema(cKEY1)
dbo:Destroy()
cTXT := "cQuery2 := 'INSERT INTO " + cKEY1 + " (' " + CRLF
cTXT += "cQuery2 += '"
FOR a = 1 TO LEN(aFLD)-1
cTXT += aFLD [A,1] + ', '
NEXT
cTXT += " " +aFLD [A,1] + ")' " + CRLF
cQT1 := CHR(34) + CHR(32) + CHR(39) + CHR(34) // " '"
cQT2 := CHR(34) + CHR(39) + ',' + CHR(32) + CHR(34) // "', "
cQT3 := CHR(34) + ')' + CHR(32) + CHR(34) // "') "
cTXT += "cQuery2 += " + "'VALUES ('" + CRLF
FOR a = 1 TO LEN(aFLD) - 1
cVAR := 'c' + aFLD [A,1]
IF UPPER(ALLTRIM( aFLD [A,2] )) == 'DATE'
cTXT += 'cQuery2 += ' + cQT1 + ' + DATE2SQL(' + cVAR + ') + ' + cQT2 + CRLF
ELSE
cTXT += 'cQuery2 += ' + cQT1 + ' + STRVALUE(' + cVAR + ') + ' + cQT2 + CRLF
ENDIF
NEXT
cVAR := 'c' + aFLD [A,1]
IF UPPER(ALLTRIM( aFLD [A,2] )) == 'DATE'
cTXT += 'cQuery2 += ' + cQT1 + ' + DATE2SQL(' + cVAR + ') + ' + cQT3 + CRLF
ELSE
cTXT += 'cQuery2 += ' + cQT1 + ' + STRVALUE(' + cVAR + ') + ' + cQT3 + CRLF
ENDIF
? cTXT
/* OUTPUT WILL LOOK LIKE THIS * /
cQuery2 := 'INSERT INTO aTABLE_NAME ('
cQuery2 += 'field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13)'
cQuery2 += 'VALUES ('
cQuery2 += " '" + STRVALUE(cfield1) + "', "
cQuery2 += " '" + STRVALUE(cfield2) + "', "
cQuery2 += " '" + STRVALUE(cfield3) + "', "
cQuery2 += " '" + STRVALUE(cfield4) + "', "
cQuery2 += " '" + STRVALUE(cfield5) + "', "
cQuery2 += " '" + STRVALUE(cfield6) + "', "
cQuery2 += " '" + STRVALUE(cfield7) + "', "
cQuery2 += " '" + STRVALUE(cfield8) + "', "
cQuery2 += " '" + STRVALUE(cfield9) + "', "
cQuery2 += " '" + STRVALUE(cfield10) + "', "
cQuery2 += " '" + STRVALUE(cfield11) + "', "
cQuery2 += " '" + STRVALUE(cfield12) + "', "
cQuery2 += " '" + STRVALUE(cfield13) + ") "
*/
// System.Clipboard := cTXT
// MSGINFO('Copied to clipboard')
RETURN
FUNCTION Create_UPDATE ( cKEY1)
/******************************/
LOCAL cQuery2, cTXT, cQT1, cQT2, cQT3, a, cVAR
IF EMPTY(qHST) .OR. EMPTY(qUSR) .OR. EMPTY(qPAW) .OR. EMPTY(qDBN) .OR. EMPTY(cKEY1)
MSGINFO(qMSG_5 ,'NOK' )
RETURN
ENDIF
IF SQL_Connect(qHST, qUSR, qPAW, qDBN) == Nil
MSGINFO('SQL_CONNECT_ERROR' ,'NOK' )
RETURN
ENDIF
Get_Information_Schema(cKEY1)
dbo:Destroy()
aWHERE := {}
aSET := {}
FOR a = 1 to len(aINDEXES)
FOR b = 1 to len(aFLD)
IF aINDEXES [a] == aFLD [b] [1]
aFLD [b] [5] := 'Unique'
EXIT
ENDIF
NEXT
AADD(aWHERE, {aFLD [b] [1], aFLD [b] [2]})
NEXT
FOR b = 1 to len(aFLD)
GEV := FALSE
FOR a = 1 to len(aWHERE)
IF aWHERE [a] [1] == aFLD [b] [1]
GEV := TRUE
EXIT
ENDIF
NEXT
IF !GEV
AADD(aSET, {aFLD [b] [1], aFLD [b] [2]})
ENDIF
NEXT
cQT1 := CHR(34) + CHR(32) + CHR(39) + CHR(34) // " '"
cQT2 := CHR(34) + CHR(39) + ',' + CHR(32) + CHR(34) // "', "
cQT3 := CHR(34) + ')' + CHR(32) + CHR(34) // "') "
cQT4 := CHR(39) + CHR(34) + CHR(32) + CHR(39) // '" '
cTXT := "cQuery2 := 'UPDATE " + cKEY1 + " ' " + CRLF
cVAR := 'c' + aSET [1,1]
IF UPPER(ALLTRIM( aFLD [1,2] )) == 'DATE'
cTXT += "cQuery2 += 'SET " + aSET [1,1] + ' = "' + "' +" + ' DATE2SQL(' + cVAR + ") + " + cQT4 + CRLF // SET NON-KEYS
ELSE
cTXT += "cQuery2 += 'SET " + aSET [1,1] + ' = "' + "' +" + ' STRVALUE(' + cVAR + ") + " + cQT4 + CRLF // SET NON-KEYS
ENDIF
FOR a := 2 to len(aSET)
cVAR := 'c' + aSET [a,1]
IF UPPER(ALLTRIM( aSET [A,2] )) == 'DATE'
cTXT += "cQuery2 += ' , " + aSET [a,1] + ' = "' + "' +" + ' DATE2SQL(' + cVAR + ") + " + cQT4 + CRLF // SET NON-KEYS
ELSE
cTXT += "cQuery2 += ' , " + aSET [a,1] + ' = "' + "' +" + ' STRVALUE(' + cVAR + ") + " + cQT4 + CRLF // SET NON-KEYS
ENDIF
NEXT
cVAR := 'c' + aWHERE [1,1]
IF UPPER(ALLTRIM( aWHERE [1,2] )) == 'DATE'
cTXT += "cQuery2 += 'WHERE " + aWHERE [1,1] + ' = "' + "' +" + ' DATE2SQL(' + cVAR + ") + " + cQT4 + CRLF // SET NON-KEYS
ELSE
cTXT += "cQuery2 += 'WHERE " + aWHERE [1,1] + ' = "' + "' +" + ' STRVALUE(' + cVAR + ") + " + cQT4 + CRLF // SET NON-KEYS
ENDIF
for a := 2 to len(aWHERE)
cVAR := 'c' + aWHERE [a,1]
IF UPPER(ALLTRIM( aFLD [A,2] )) == 'DATE'
cTXT += "cQuery2 += ' AND " + aWHERE [a,1] + ' = "' + "' +" + ' DATE2SQL(' + cVAR + ") + " + cQT4 + CRLF // SET NON-KEYS
ELSE
cTXT += "cQuery2 += ' AND " + aWHERE [a,1] + ' = "' + "' +" + ' STRVALUE(' + cVAR + ") + " + cQT4 + CRLF // SET NON-KEYS
ENDIF
next
? cTXT
/* SOMETHING LIKE THIS * /
cQuery2 := 'UPDATE aTABLE_NAME '
cQuery2 += 'SET field6 = "' + STRVALUE(cfield6) + '" '
cQuery2 += ' , field6 = "' + STRVALUE(cfield7) + '" '
cQuery2 += ' , field6 = "' + STRVALUE(cfield8) + '" '
cQuery2 += ' , field6 = "' + STRVALUE(cfield9) + '" '
cQuery2 += ' , field6 = "' + STRVALUE(cfield10) + '" '
cQuery2 += ' , field6 = "' + STRVALUE(cfield11) + '" '
cQuery2 += ' , field6 = "' + STRVALUE(cfield12) + '" '
cQuery2 += ' , field6 = "' + STRVALUE(cfield13) + '" '
cQuery2 += 'WHERE field1 = "' + STRVALUE(cfield1) + '" '
cQuery2 += ' AND field2 = "' + STRVALUE(cfield2) + '" '
cQuery2 += ' AND field3 = "' + STRVALUE(cfield3) + '" '
cQuery2 += ' AND field4 = "' + STRVALUE(cfield4) + '" '
cQuery2 += ' AND field5 = "' + STRVALUE(cfield5) + '" '
*/
//System.Clipboard := cTXT
//MSGINFO('Copied to clipboard')
RETURN
FUNCTION Create_DELETE ( cKEY1)
/******************************/
LOCAL cQuery2, cTXT, cQT1, cQT2, cQT3, a, cVAR
IF EMPTY(qHST) .OR. EMPTY(qUSR) .OR. EMPTY(qPAW) .OR. EMPTY(qDBN) .OR. EMPTY(cKEY1)
MSGINFO(qMSG_5 ,'NOK' )
RETURN
ENDIF
IF SQL_Connect(qHST, qUSR, qPAW, qDBN) == Nil
MSGINFO('SQL_CONNECT_ERROR' ,'NOK' )
RETURN
ENDIF
Get_Information_Schema(cKEY1)
dbo:Destroy()
aWHERE := {}
aSET := {}
FOR a = 1 to len(aINDEXES)
FOR b = 1 to len(aFLD)
IF aINDEXES [a] == aFLD [b] [1]
aFLD [b] [5] := 'Unique'
EXIT
ENDIF
NEXT
AADD(aWHERE, {aFLD [b] [1], aFLD [b] [2]})
NEXT
FOR b = 1 to len(aFLD)
GEV := FALSE
FOR a = 1 to len(aWHERE)
IF aWHERE [a] [1] == aFLD [b] [1]
GEV := TRUE
EXIT
ENDIF
NEXT
IF !GEV
AADD(aSET, {aFLD [b] [1], aFLD [b] [2]})
ENDIF
NEXT
cQT1 := CHR(34) + CHR(32) + CHR(39) + CHR(34) // " '"
cQT2 := CHR(34) + CHR(39) + ',' + CHR(32) + CHR(34) // "', "
cQT3 := CHR(34) + ')' + CHR(32) + CHR(34) // "') "
cQT4 := CHR(39) + CHR(34) + CHR(32) + CHR(39) // '" '
cTXT := "cQuery2 := 'DELETE FROM " + cKEY1 + " ' " + CRLF
cVAR := 'c' + aWHERE [1,1]
cTXT += "cQuery2 += 'WHERE " + aWHERE [1,1] + ' = "' + "' +" + ' STRVALUE(' + cVAR + ") + " + cQT4 + CRLF // SET NON-KEYS
for a := 2 to len(aWHERE)
cVAR := 'c' + aWHERE [a,1]
IF UPPER(ALLTRIM( aWHERE [A,2] )) == 'DATE'
cTXT += "cQuery2 += ' AND " + aWHERE [a,1] + ' = "' + "' +" + ' DATE2SQL(' + cVAR + ") + " + cQT4 + CRLF // SET NON-KEYS
ELSE
cTXT += "cQuery2 += ' AND " + aWHERE [a,1] + ' = "' + "' +" + ' STRVALUE(' + cVAR + ") + " + cQT4 + CRLF // SET NON-KEYS
ENDIF
next
? cTXT
/* example * /
cQuery2 := 'DELETE FROM aTABLE_NAME '
cQuery2 += 'WHERE field1 = "' + STRVALUE(cfield1) + '" '
cQuery2 += ' AND field2 = "' + STRVALUE(cfield2) + '" '
cQuery2 += ' AND field3 = "' + STRVALUE(cfield3) + '" '
cQuery2 += ' AND field4 = "' + STRVALUE(cfield4) + '" '
cQuery2 += ' AND field5 = "' + STRVALUE(cfield5) + '" '
*/
// System.Clipboard := cTXT
// MSGINFO('Copied to clipboard')
RETURN
FUNCTION Create_PHP_INSERT( cKEY1)
/******************************/
LOCAL cQuery2, cTXT, cQT1, cQT2, cQT3, a, cVAR
IF EMPTY(qHST) .OR. EMPTY(qUSR) .OR. EMPTY(qPAW) .OR. EMPTY(qDBN) .OR. EMPTY(cKEY1)
MSGINFO(qMSG_5 ,'NOK' )
RETURN
ENDIF
IF SQL_Connect(qHST, qUSR, qPAW, qDBN) == Nil
MSGINFO('SQL_CONNECT_ERROR' ,'NOK' )
RETURN
ENDIF
Get_Information_Schema(cKEY1)
dbo:Destroy()
cTXT := "$cQuery2 = 'INSERT INTO " + cKEY1 + " ('; " + CRLF
cTXT += "$cQuery2 .= '"
FOR a = 1 TO LEN(aFLD)-1
cTXT += aFLD [A,1] + ', '
NEXT
cTXT += " " +aFLD [A,1] + ")'; " + CRLF
cQT1 := CHR(34) + CHR(32) + CHR(39) + CHR(34) // " '"
cQT2 := CHR(34) + CHR(39) + ',' + CHR(32) + CHR(34) + ';' // "', "
cQT3 := CHR(34) + ')' + CHR(32) + CHR(34) + ';' // "') "
cTXT += "$cQuery2 .= " + "'VALUES ('; " + CRLF
FOR a = 1 TO LEN(aFLD) - 1
cVAR := '$c' + aFLD [A,1]
cTXT += '$cQuery2 .= ' + cQT1 + ' . ' + cVAR + ' . ' + cQT2 + CRLF
NEXT
cVAR := '$c' + aFLD [A,1]
cTXT += '$cQuery2 .= ' + cQT1 + ' . ' + cVAR + ' . ' + cQT3 + CRLF
? cTXT
//System.Clipboard := cTXT
//MSGINFO('Copied to clipboard')
RETURN
FUNCTION Create_PHP_UPDATE( cKEY1)
/******************************/
LOCAL cQuery2, cTXT, cQT1, cQT2, cQT3, a, cVAR
IF EMPTY(qHST) .OR. EMPTY(qUSR) .OR. EMPTY(qPAW) .OR. EMPTY(qDBN) .OR. EMPTY(cKEY1)
MSGINFO(qMSG_5 ,'NOK' )
RETURN
ENDIF
IF SQL_Connect(qHST, qUSR, qPAW, qDBN) == Nil
MSGINFO('SQL_CONNECT_ERROR' ,'NOK' )
RETURN
ENDIF
Get_Information_Schema(cKEY1)
dbo:Destroy()
aWHERE := {}
aSET := {}
FOR a = 1 to len(aINDEXES)
FOR b = 1 to len(aFLD)
IF aINDEXES [a] == aFLD [b] [1]
aFLD [b] [5] := 'Unique'
EXIT
ENDIF
NEXT
AADD(aWHERE, {aFLD [b] [1], aFLD [b] [2]})
NEXT
FOR b = 1 to len(aFLD)
GEV := FALSE
FOR a = 1 to len(aWHERE)
IF aWHERE [a] [1] == aFLD [b] [1]
GEV := TRUE
EXIT
ENDIF
NEXT
IF !GEV
AADD(aSET, {aFLD [b] [1], aFLD [b] [2]})
ENDIF
NEXT
cQT1 := CHR(34) + CHR(32) + CHR(39) + CHR(34) // " '"
cQT2 := CHR(34) + CHR(39) + ',' + CHR(32) + CHR(34) // "', "
cQT3 := CHR(34) + ')' + CHR(32) + CHR(34) // "') "
cQT4 := CHR(39) + CHR(34) + CHR(32) + CHR(39) + ';' // '" '
cTXT := "$cQuery2 = 'UPDATE " + cKEY1 + " '; " + CRLF
cVAR := '$c' + aSET [1,1]
cTXT += "$cQuery2 .= 'SET " + aSET [1,1] + ' = "' + "' . " + ' ' + cVAR + " . " + cQT4 + CRLF // SET NON-KEYS
FOR a := 2 to len(aSET)
cVAR := '$c' + aSET [a,1]
cTXT += "$cQuery2 .= ' , " + aSET [a,1] + ' = "' + "' . " + cVAR + " . " + cQT4 + CRLF // SET NON-KEYS
NEXT
cVAR := '$c' + aWHERE [1,1]
cTXT += "$cQuery2 .= 'WHERE " + aWHERE [1,1] + ' = "' + "' . " + ' ' + cVAR + " . " + cQT4 + CRLF // SET NON-KEYS
for a := 2 to len(aWHERE)
cVAR := '$c' + aWHERE [a,1]
cTXT += "$cQuery2 .= ' AND " + aWHERE [a,1] + ' = "' + "' . " + ' ' + cVAR + " . " + cQT4 + CRLF // SET NON-KEYS
next
? cTXT
/* something like this * /
$cQuery2 = 'UPDATE aTABLE_NAME ' ;
$cQuery2 .= 'SET field6 = "' . cfield6 . '" ';
$cQuery2 .= ' , field6 = "' . cfield7 . '" ';
$cQuery2 .= ' , field6 = "' . cfield8 . '" ';
$cQuery2 .= ' , field6 = "' . cfield9 . '" ';
$cQuery2 .= ' , field6 = "' . cfield10 . '" ';
$cQuery2 .= ' , field6 = "' . cfield11 . '" ';
$cQuery2 .= ' , field6 = "' . cfield12 . '" ';
$cQuery2 .= ' , field6 = "' . cfield13 . '" ';
$cQuery2 .= 'WHERE field1 = "' . cfield1 . '" ';
$cQuery2 .= ' AND field2 = "' . cfield2 . '" ';
$cQuery2 .= ' AND field3 = "' . cfield3 . '" ';
$cQuery2 .= ' AND field4 = "' . cfield4 . '" ';
$cQuery2 .= ' AND field5 = "' . cfield5 . '" ';
*/
//System.Clipboard := cTXT
//MSGINFO('Copied to clipboard')
RETURN
FUNCTION Create_PHP_DELETE(cKEY1)
/********************************/
LOCAL cQuery2, cTXT, cQT1, cQT2, cQT3, a, cVAR
IF EMPTY(qHST) .OR. EMPTY(qUSR) .OR. EMPTY(qPAW) .OR. EMPTY(qDBN) .OR. EMPTY(cKEY1)
MSGINFO(qMSG_5 ,'NOK' )
RETURN
ENDIF
IF SQL_Connect(qHST, qUSR, qPAW, qDBN) == Nil
MSGINFO('SQL_CONNECT_ERROR' ,'NOK' )
RETURN
ENDIF
Get_Information_Schema(cKEY1)
dbo:Destroy()
aWHERE := {}
aSET := {}
FOR a = 1 to len(aINDEXES)
FOR b = 1 to len(aFLD)
IF aINDEXES [a] == aFLD [b] [1]
aFLD [b] [5] := 'Unique'
EXIT
ENDIF
NEXT
AADD(aWHERE, {aFLD [b] [1], aFLD [b] [2]})
NEXT
FOR b = 1 to len(aFLD)
GEV := FALSE
FOR a = 1 to len(aWHERE)
IF aWHERE [a] [1] == aFLD [b] [1]
GEV := TRUE
EXIT
ENDIF
NEXT
IF !GEV
AADD(aSET, {aFLD [b] [1], aFLD [b] [2]})
ENDIF
NEXT
cQT1 := CHR(34) + CHR(32) + CHR(39) + CHR(34) // " '"
cQT2 := CHR(34) + CHR(39) + ',' + CHR(32) + CHR(34) // "', "
cQT3 := CHR(34) + ')' + CHR(32) + CHR(34) // "') "
cQT4 := CHR(39) + CHR(34) + CHR(32) + CHR(39) + ';' // '" '
cTXT := "$cQuery2 = 'DELETE FROM " + cKEY1 + " '; " + CRLF
cVAR := '$c' + aWHERE [1,1]
cTXT += "$cQuery2 .= 'WHERE " + aWHERE [1,1] + ' = "' + "' . " + cVAR + ' . ' + cQT4 + CRLF // SET NON-KEYS
for a := 2 to len(aWHERE)
cVAR := '$c' + aWHERE [a,1]
cTXT += "$cQuery2 .= ' AND " + aWHERE [a,1] + ' = "' + "' . " + cVAR + ' . ' + cQT4 + CRLF // SET NON-KEYS
next
? cTXT
/* something like this * /
$cQuery2 = 'DELETE FROM aTABLE_NAME ' ;
$cQuery2 .= 'WHERE field1 = "' . cfield1 . '" ';
$cQuery2 .= ' AND field2 = "' . cfield2 . '" ';
$cQuery2 .= ' AND field3 = "' . cfield3 . '" ';
$cQuery2 .= ' AND field4 = "' . cfield4 . '" ';
$cQuery2 .= ' AND field5 = "' . cfield5 . '" ';
*/
//System.Clipboard := cTXT
//MSGINFO('Copied to clipboard')
RETURN
FUNCTION SQL_Connect(host,user,password,dbname)
/**********************************************/
dbo := tmysqlserver():new(AllTrim(host),AllTrim(user),AllTrim(password))
IF dbo:NetErr()
msginfo(dbo:ERROR())
RETURN nil
ENDIF
dbo:selectdb(dbname)
IF dbo:NetErr()
msginfo(dbo:ERROR())
RETURN nil
ENDIF
RETURN dbo
FUNCTION DATE2SQL(xDATE)
/***********************/
IF VALTYPE(xDATE) == 'D'
xDATE := DTOC(xDATE)
ENDIF
xDATE := SUBSTR(xDATE,7,4) + '-' + SUBSTR(xDATE,4,2) + '-' + SUBSTR(xDATE,1,2)
IF xDATE == ' - - '
xDATE := 'NULL'
ENDIF
RETURN (xDATE)
FUNCTION Strvalue( string, onoff )
/*********************************/
LOCAL retval := pNULL
onoff := Valid_parm( onoff, pLOGICAL, FALSE )
DO CASE
CASE VALTYPE( string ) == pCHARACTER
retval := ALLTRIM(string)
CASE VALTYPE( string ) == pNUMERIC
retval := LTRIM( STR( string ) )
CASE VALTYPE( string ) == pMEMO
retval := IF( (LEN(string) > (MEMORY(0) * 1024) * .80), ;
SUBSTR(string,1, INT((MEMORY(0) * 1024) * .80)), ;
string )
CASE VALTYPE( string ) == pDATE
retval := DTOC( string )
CASE VALTYPE( string ) == pLOGICAL
retval := IF( ( onoff ), IF(string, "On", "Off"), ;
IF(string, "True", "False") )
OTHERWISE
retval := ''
ENDCASE
RETURN( retval )