Export (dump) d'une table VFP en fichier ascii au format importable par MySQL (commandes SQL)
# 0000000340
ajouté le 09/07/2006 23:18:13 et modifié le 10/07/2006
consulté 13019 fois
Niveau
initié
Version(s) Foxpro : VFP 9.0
Description
Suite à une demande de "RORO" dans le NG fox fr, je propose une réponse à l'exportation d'une table dans fichier .sql incorporable par mySQL.
cela est fait rapidement... donc les types de data vfp / types sql sont à vérifier
Cordialement
Francis FAURE
Code source :
* Francis Faure * 9/7/2006 * Dump Dbf->Sql * but: générer un fichier texte pour importation dans mysql * a vérifier : les types et a tester... * v1.1 du 10/07/2006 !: gestion des binary, date, numérique * Ne gére pas les champs de type "GENERAL"
clear SETDATEfrench SETCENTURYon
LOCAL ls_export_mysql_file asstring
ls_export_mysql_file = "c:\temp\test.sql"
USEHOME()+"samples\northwind\customers.dbf"
=WriteDumpSQL(ls_export_mysql_file, .F. ) use
USEHOME()+"samples\northwind\products.dbf"
=WriteDumpSQL(ls_export_mysql_file, .T. ) use
* fichier a incoporer dans mysql MODIFYCOMMAND (ls_export_mysql_file)
return
FUNCTION WriteDumpSQL(ts_fichier_sql asstring, tl_appended as logical) as Boolean LOCALARRAYla_Champs[1,18] LOCAL li_nombre_de_champs asInteger LOCAL li_i asInteger LOCAL li_select asInteger LOCAL ls_sql asstring LOCAL ls_champ asstring LOCAL ls_type asstring LOCAL ls_width asstring LOCAL ls_precision asstring LOCAL ll_binary as Logical
#define csCRLF CHR(13)+CHR(10) && peut être " " c'est pour la lisibilité
#define cs_delimiteur chr(96) IFEMPTY(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 * nom du champ
ls_sql = ls_sql + cs_delimiteur+la_Champs[li_i, 1]+cs_delimiteur * type : * A vérifier la correspondance des types vfp / mysql .... * ---------_
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] DOcase CASE ls_type == "C"&& character IF ll_binary
ls_sql = ls_sql + " VARCHAR("+ls_width+") BINARY " else
ls_sql = ls_sql + " VARCHAR("+ls_width+") " endif CASE ls_type == "Y"&& Currency
ls_sql = ls_sql + " DECIMAL("+ls_width+","+ls_precision+") " CASE ls_type == "D"&& Date
ls_sql = ls_sql + " DATE " CASE ls_type == "T"&& DateTime
ls_sql = ls_sql + " DATETIME " CASE ls_type == "B"&& Double
ls_sql = ls_sql + " DOUBLE("+ls_width+","+ls_precision+") " CASE ls_type == "F"&& Float
ls_sql = ls_sql + " FLOAT("+ls_width+","+ls_precision+") " CASE ls_type == "G"&& General
ls_sql = ls_sql + " BLOB " CASE ls_type == "I"&& Integer
ls_sql = ls_sql + " INT("+ls_width+") " CASE ls_type == "L"&& Logical
ls_sql = ls_sql + " SMALLINT(1) " CASE ls_type == "M"&& Memo IF ll_binary
ls_sql = ls_sql + " BLOB " ELSE
ls_sql = ls_sql + " TEXT " endif CASE ls_type == "N"&& Numeric
ls_sql = ls_sql + " DOUBLE("+ls_width+","+ls_precision+") " CASE ls_type == "Q"&& Varbinary
ls_sql = ls_sql + " VARCHAR("+ls_width+") BINARY " CASE ls_type == "V"&& Varchar IF ll_binary
ls_sql = ls_sql + " VARCHAR("+ls_width+") " ELSE
ls_sql = ls_sql + " VARCHAR("+ls_width+") BINARY " endif CASE ls_type == "W"&& Blob
ls_sql = ls_sql + " BLOB " OTHERWISE
=MESSAGEBOX("Erreur de programmation, type inconnu : à traiter!") RETURN.F. ENDCASE * null values allowed IFla_Champs[li_i, 5]
ls_sql = ls_sql + "null " ELSE
ls_sql = ls_sql + "not null " ENDIF * field default value IFNOTEMPTY(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 * AUTO_INCREMENT IFla_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 * champs
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 IFla_Champs[li_i, 2]="G"&& ignorer le champ général 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 IFla_Champs[li_i, 2]="G"&& ignorer le champ général 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
FUNCTION Transformer(t_champ, tl_en_binaire) asstring LOCAL ls_return asString LOCAL li_i IFISNULL(t_champ)
ls_return = "NULL" ELSE DOcase CASE tl_en_binaire * cas du binaire a transformer en hexadecimal IFLEN(t_champ)>1
ls_return = "0x" FOR li_i=1 TOLEN(t_champ)
ls_return = ls_return + RIGHT(TRANSFORM( ASC(SUBSTR(t_champ,li_i,1)), "@0"),2) NEXT ELSE
ls_return = "''" ENDIF CASETYPE("t_champ")$"CMV"
ls_return = ALLTRIM(t_champ)
ls_return = STRTRAN(ls_return, CHR(92), CHR(92)+CHR(92)) && \ en \\
ls_return = STRTRAN(ls_return, CHR(39), CHR(92)+CHR(39)) && ' en \'
ls_return = "'"+ls_return+"'" CASETYPE("t_champ")$"NYBFI"
ls_return = ALLTRIM(STR(t_champ)) CASETYPE("t_champ")=="D"
ls_return = "'" + LEFT(TTOC(t_champ,3),10) + "'" CASETYPE("t_champ")=="T"
ls_return = "'" + TTOC(t_champ,3) + "'" CASETYPE("t_champ")=="L" * boolean .T. = 1 IF t_champ
ls_return = "1" ELSE
ls_return = "0" endif CASETYPE("t_champ")=="Q" * cas particulier en binaire directement IFLEN(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
Commentaires
le 10/07/2006, FredA a écrit : 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").
le 10/07/2006, Francis Faure a écrit : Fred : J'ai édité et repris mon code source, il gére maintenant les binaires et correctement les dates... reste pour le champs de type "general" ou je n'ai pas de solution cordialement
le 11/07/2006, FredA a écrit : je pense qu'en faisant un dump depuis phpmyadmin sur un tel champ on aurait la réponse assez rapidement
le 11/07/2006, Francis Faure a écrit : Rassures toi, Fred, je l'ai fait : un champ blob est exporté en chaine hexacimale, donc ce n'est pas un problème mais le problème est de récupérer le contenu d'un champ général en VFP......
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").