ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Export (dump) d'une table VFP en fichier ascii au format importable par MySQL (commandes SQL)   



L'auteur

Francis Faure
France France
Membre Actif (personne physique)
# 0000000001
enregistré le 11/10/2004

http://www.wanagain.net
51 ans
Faure Francis
de la société Design Or Decline
Fiche personnelle


Note des membres
20/20
1 vote


Contributions > 07 - SQL

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é 8953 fois
Niveau initié

Version(s) Foxpro :
VFP 9.0

Zoomer sur l'image
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
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

* fichier a incoporer dans mysql
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)  && peut être " " c'est pour la lisibilité
#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
    * 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]
    DO case
      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
    IF la_Champs[li_i, 5]
      ls_sql = ls_sql + "null "
    ELSE
      ls_sql = ls_sql + "not null "
    ENDIF
    * field default value
    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
    * AUTO_INCREMENT
    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
  * 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
      IF la_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
      IF la_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

  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
      * cas du binaire a transformer en hexadecimal
      IF LEN(t_champ)>1
        ls_return = "0x"
        FOR li_i=1 TO LEN(t_champ)
          ls_return = ls_return + RIGHT(TRANSFORMASC(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)) && \ en \\
      ls_return = STRTRAN(ls_return, CHR(39), CHR(92)+CHR(39)) && ' en \'
      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"
      * boolean .T. = 1
      IF t_champ
        ls_return = "1"
      ELSE
        ls_return = "0"
      endif
    CASE TYPE("t_champ")=="Q"
      * cas particulier en binaire directement
      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


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......


Publicité

Les pubs en cours :

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2019.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3