|
clear
SET DATE french
SET CENTURY on
LOCAL ls_export_mysql_file as string
ls_export_mysql_file = "c:\temp\test.sql"
USE HOME()+"samples\northwind\customers.dbf"
=WriteDumpSQL(ls_export_mysql_file, .F.)
use
USE HOME()+"samples\northwind\products.dbf"
=WriteDumpSQL(ls_export_mysql_file, .T.)
use
MODIFY COMMAND (ls_export_mysql_file)
return
FUNCTION WriteDumpSQL(ts_fichier_sql as string, tl_appended as logical) as Boolean
LOCAL ARRAY la_Champs[1,18]
LOCAL li_nombre_de_champs as Integer
LOCAL li_i as Integer
LOCAL li_select as Integer
LOCAL ls_sql as string
LOCAL ls_champ as string
LOCAL ls_type as string
LOCAL ls_width as string
LOCAL ls_precision as string
LOCAL ll_binary as Logical
#define csCRLF CHR(13)+CHR(10)
#define cs_delimiteur chr(96)
IF EMPTY(ALIAS())
=MESSAGEBOX("Export mysql impossible : pas de table en cours d'utilisation dans la zone active",16, "Dump Dbf2Sql")
RETURN .F.
ENDIF
li_nombre_de_champs = AFIELDS(la_Champs)
ls_sql = "CREATE TABLE "+cs_delimiteur+ALIAS()+cs_delimiteur+" ("+ csCRLF
for li_i=1 TO li_nombre_de_champs
ls_sql = ls_sql + cs_delimiteur+la_Champs[li_i, 1]+cs_delimiteur
ls_type = la_Champs[li_i, 2]
ls_width = ALLTRIM(STR(la_Champs[li_i, 3]))
ls_precision = ALLTRIM(STR(la_Champs[li_i, 4]))
ll_binary = la_Champs[li_i, 6]
DO case
CASE ls_type == "C"
IF ll_binary
ls_sql = ls_sql + " VARCHAR("+ls_width+") BINARY "
else
ls_sql = ls_sql + " VARCHAR("+ls_width+") "
endif
CASE ls_type == "Y"
ls_sql = ls_sql + " DECIMAL("+ls_width+","+ls_precision+") "
CASE ls_type == "D"
ls_sql = ls_sql + " DATE "
CASE ls_type == "T"
ls_sql = ls_sql + " DATETIME "
CASE ls_type == "B"
ls_sql = ls_sql + " DOUBLE("+ls_width+","+ls_precision+") "
CASE ls_type == "F"
ls_sql = ls_sql + " FLOAT("+ls_width+","+ls_precision+") "
CASE ls_type == "G"
ls_sql = ls_sql + " BLOB "
CASE ls_type == "I"
ls_sql = ls_sql + " INT("+ls_width+") "
CASE ls_type == "L"
ls_sql = ls_sql + " SMALLINT(1) "
CASE ls_type == "M"
IF ll_binary
ls_sql = ls_sql + " BLOB "
ELSE
ls_sql = ls_sql + " TEXT "
endif
CASE ls_type == "N"
ls_sql = ls_sql + " DOUBLE("+ls_width+","+ls_precision+") "
CASE ls_type == "Q"
ls_sql = ls_sql + " VARCHAR("+ls_width+") BINARY "
CASE ls_type == "V"
IF ll_binary
ls_sql = ls_sql + " VARCHAR("+ls_width+") "
ELSE
ls_sql = ls_sql + " VARCHAR("+ls_width+") BINARY "
endif
CASE ls_type == "W"
ls_sql = ls_sql + " BLOB "
OTHERWISE
=MESSAGEBOX("Erreur de programmation, type inconnu : à traiter!")
RETURN .F.
ENDCASE
IF la_Champs[li_i, 5]
ls_sql = ls_sql + "null "
ELSE
ls_sql = ls_sql + "not null "
ENDIF
IF NOT EMPTY(la_Champs[li_i, 9])
ls_champ = la_Champs[li_i, 9]
ls_sql = ls_sql + "default "+Transformer(ls_champ, la_Champs[li_i, 6])+" "
ENDIF
IF la_Champs[li_i, 18]<>0
ls_sql = ls_sql + "AUTO_INCREMENT PRIMARY KEY "
endif
IF li_i<li_nombre_de_champs
ls_sql = ls_sql + ","+csCRLF
ELSE
ls_sql = ls_sql + csCRLF
endif
NEXT
ls_sql = ls_sql + ");"+ csCRLF
ls_sql = ls_sql + csCRLF
SCAN
ls_sql = ls_sql + "INSERT INTO "+cs_delimiteur+ALIAS()+cs_delimiteur+ " ("+ csCRLF
for li_i=1 TO li_nombre_de_champs
IF la_Champs[li_i, 2]="G"
LOOP
endif
ls_champ = la_Champs[li_i, 1]
ls_sql = ls_sql + cs_delimiteur+ ls_champ + cs_delimiteur
IF li_i<li_nombre_de_champs
ls_sql = ls_sql + ","+csCRLF
ELSE
ls_sql = ls_sql + csCRLF
endif
next
ls_sql = ls_sql + ")" + csCRLF
ls_sql = ls_sql + " VALUES ("
for li_i=1 TO li_nombre_de_champs
IF la_Champs[li_i, 2]="G"
LOOP
endif
ls_champ = EVALUATE(la_Champs[li_i, 1])
ls_sql = ls_sql + Transformer(ls_champ, la_Champs[li_i, 6])
IF li_i<li_nombre_de_champs
ls_sql = ls_sql + ","+csCRLF
ELSE
ls_sql = ls_sql + csCRLF
endif
next
ls_sql = ls_sql + ");" + csCRLF
ENDSCAN
ls_sql = ls_sql + csCRLF
SET SAFETY OFF
=STRTOFILE(ls_sql, ts_fichier_sql, tl_appended)
SET SAFETY ON
RETURN .T.
FUNCTION Transformer(t_champ, tl_en_binaire) as string
LOCAL ls_return as String
LOCAL li_i
IF ISNULL(t_champ)
ls_return = "NULL"
ELSE
DO case
CASE tl_en_binaire
IF LEN(t_champ)>1
ls_return = "0x"
FOR li_i=1 TO LEN(t_champ)
ls_return = ls_return + RIGHT(TRANSFORM( ASC(SUBSTR(t_champ,li_i,1)), "@0"),2)
NEXT
ELSE
ls_return = "''"
ENDIF
CASE TYPE("t_champ")$"CMV"
ls_return = ALLTRIM(t_champ)
ls_return = STRTRAN(ls_return, CHR(92), CHR(92)+CHR(92))
ls_return = STRTRAN(ls_return, CHR(39), CHR(92)+CHR(39))
ls_return = "'"+ls_return+"'"
CASE TYPE("t_champ")$"NYBFI"
ls_return = ALLTRIM(STR(t_champ))
CASE TYPE("t_champ")=="D"
ls_return = "'" + LEFT(TTOC(t_champ,3),10) + "'"
CASE TYPE("t_champ")=="T"
ls_return = "'" + TTOC(t_champ,3) + "'"
CASE TYPE("t_champ")=="L"
IF t_champ
ls_return = "1"
ELSE
ls_return = "0"
endif
CASE TYPE("t_champ")=="Q"
IF LEN(t_champ)>1
ls_return = "0x" + TRANSFORM(t_champ)
ELSE
ls_return = "''"
ENDIF
OTHERWISE
ls_return = "'?'"
=MESSAGEBOX("a traiter Transformer type="+TYPE("t_champ"))
ENDCASE
endif
RETURN ls_return
|
Dans le cas du M ou du C tu devrais tester le membre 6 du tableau pour affiner la convertion texte ou binaire. Dans ce cas, il faut aussi ajouter à la fonction Transformer ces types binaires et les passer comme une suite de CHAR()+CHAR()+ etc... ou tout autre codage admis par la base de données (au moins pour les valeurs non "lisibles").