Créer un fichier DBF dBase



Ce programme me permet de créer une table dBase DBF de niveau 7.

Les champs créés sont ceux possibles avec la commande CREATE TABLE.

Attention aux noms des champs interdits, je ne les connais pas tous, modifier si besoin this.Tableau2

J'utilise la version de dBasplus 2.01 (DB2K).


* CreeUneTable.wfm - Créer une table DBF dBase.
* ---------------------------------------------
*

/*

 En cours :

 
 A faire :

 - Mettre message d'attente pendant création et importation

 - Insertion de champ

 - Copy and Paste

 - Voir _DBASELOCK

 - Mettre verrou si 1er nom de champ est un chiffre

 - Faire tableau des noms déjà saisis et vérifier à la saisie et la création

*/

*
LOCAL F
F = new CreeTable()
F.readModal()
*
* ------------------------------------------------------------------------------
CLASS CreeTable of FORM
* ------------------------------------------------------------------------------
*
* Table des informations de la table à créer.
*
IF _app.databases[1].tableExists("0CreeTableInfo35854698.dbf")
 _app.databases[1].dropTable("0CreeTableInfo35854698.dbf")
ENDIF
*
CREATE TABLE "0CreeTableInfo35854698.dbf" ( ;
  ChampNom  CHAR(64) , ;
  ChampType CHAR(16)  , ;
  ChampLong NUMERIC(16), ;
  ChampDec  NUMERIC(10))
*
this.Tableau1 = new Array()                     && Tableau choix du type.
this.Tableau1.add("Caractère")
this.Tableau1.add("Numérique")
this.Tableau1.add("Date")
this.Tableau1.add("Logique")
this.Tableau1.add("Double")
this.Tableau1.add("Mémo")
this.Tableau1.add("Binaire")
this.Tableau1.add("OLE")
this.Tableau1.add("Timestamp")
this.Tableau1.add("Integrer Long")
this.Tableau1.add("AutoIncrement")
*
this.Tableau2 = new Array()                     && Noms de champs interdits CREATE TABLE.
this.Tableau2.add("AUTOINC")
this.Tableau2.add("CHAR")
this.Tableau2.add("CHARACTER")
this.Tableau2.add("DATE")
this.Tableau2.add("DOUBLE")
this.Tableau2.add("FLOAT")
this.Tableau2.add("INT")
this.Tableau2.add("LONG")
this.Tableau2.add("NUMERIC")
this.Tableau2.add("OF")
this.Tableau2.add("TIMESTAMP")
*
this.Dossier    = set("Directory")
this.Enregistre = 0                             && Information enregistré.
this.TableNom   = null                          && Nom de la table avec chemin.
*
with (this)
 mdi       := .F.
 sysMenu   := .F.
 escExit   := .F.
 height    := 18
 left      := 30
 top       := 2
 width     := 90.5
 text      := "Créer une table"
 onOpen    := class::Form_OnOpen
endwith
*
this.QUERY1 = new QUERY()
this.QUERY1.parent = this
 with (this.QUERY1)
  left   := -0.1429
  top    := -0.0455
  sql    := 'select * from "0CreeTableInfo35854698.dbf"'
  active := .T.
  parent := this.QUERY1.rowset
  rowset.fields["ChampType"].onChange := class::Field_OnChange
  rowset.fields["ChampType"].Forme = form
  rowset.fields["ChampLong"].onChange := class::Field_OnChange
  rowset.fields["ChampLong"].Forme = form
  rowset.fields["ChampDec"].onChange := class::Field_OnChange
  rowset.fields["ChampDec"].Forme = form
 endwith
*
this.GRID1 = new GRID(this)
 with (this.GRID1)
  dataLink = form.QUERY1.rowset
  *
  columns["COLUMN1"] = new GRIDCOLUMN(form.GRID1)
  columns["COLUMN1"].dataLink := form.QUERY1.rowset.fields["ChampNom"]
  columns["COLUMN1"].editorType := 1     && Entryfield
  columns["COLUMN1"].width := 30
  columns["COLUMN1"].headingControl.value := "Nom"
  *
  columns["COLUMN2"] = new GRIDCOLUMN(form.GRID1)
  columns["COLUMN2"].dataLink := form.QUERY1.rowset.fields["ChampType"]
  columns["COLUMN2"].editorType := 4     && Combobox
  columns["COLUMN2"].width := 20
  columns["COLUMN2"].headingControl.value := "Type"
  columns["COLUMN2"].editorControl.dataSource := "array form.Tableau1"
  columns["COLUMN2"].editorControl.dropDownHeight := 14
  *
  columns["COLUMN3"] = new GRIDCOLUMN(form.GRID1)
  columns["COLUMN3"].dataLink := form.QUERY1.rowset.fields["ChampLong"]
  columns["COLUMN3"].editorType := 3     && Spinbox
  columns["COLUMN3"].width := 20
  columns["COLUMN3"].headingControl.value := "Longueur"
  *
  columns["COLUMN4"] = new GRIDCOLUMN(form.GRID1)
  columns["COLUMN4"].dataLink := form.QUERY1.rowset.fields["ChampDec"]
  columns["COLUMN4"].editorType := 3     && Spinbox
  columns["COLUMN4"].width := 14
  columns["COLUMN4"].headingControl.value := "Décimale"
  *
  allowColumnMoving := .F.
  allowColumnSizing := .F.
  allowRowSizing    := .F.
  cellHeight   := 1
  allowAddRows := .F.
  height       := 15
  left         := 0.9
  top          := 0
  width        := form.width
 endwith
*
this.Pb1 = new PUSHBUTTON(this)
 with (this.Pb1)
  onClick := class::Ajouter
  height  := 1
  left    := this.GRID1.left
  top     := this.GRID1.top + this.GRID1.height + 0.1
  width   := 14.06
  text    := "Ajouter"
 endwith
*
this.Pb2 = new PUSHBUTTON(this)
 with (this.Pb2)
  onClick := class::Detruit
  height  := this.Pb1.height
  left    := this.Pb1.left + this.Pb1.width + 1
  top     := this.Pb1.top
  width   := this.Pb1.width
  text    := "Supprimer"
 endwith
*
this.Pb3 = new PUSHBUTTON(this)
 with (this.Pb3)
  onClick := class::Importer
  height  := this.Pb2.height
  left    := this.Pb2.left + this.Pb2.width + 1
  top     := this.Pb2.top
  width   := this.Pb2.width
  text    := "Import"
 endwith
*
this.Pb4 = new PUSHBUTTON(this)
 with (this.Pb4)
  onClick := class::DossierCherche
  height  := this.Pb3.height
  left    := this.Pb3.left + this.Pb3.width + 1
  top     := this.Pb3.top
  width   := this.Pb3.width
  text    := "Dossier"
 endwith
*
this.Pb5 = new PUSHBUTTON(this)
 with (this.Pb5)
  onClick := class::Creer
  height  := this.Pb4.height
  left    := this.Pb4.left + this.Pb4.width + 1
  top     := this.Pb4.top
  width   := this.Pb4.width
  text    := "Créer"
 endwith
*
this.Pb6 = new PUSHBUTTON(this)
 with (this.Pb6)
  onClick := class::Quitte
  height  := this.Pb5.height
  left    := this.Pb5.left + this.Pb5.width + 1
  top     := this.Pb5.top
  width   := this.Pb5.width
  text    := "Quitter"
 endwith
*
this.TEXT1 = new TEXT(this)
 with (this.TEXT1)
  top           := this.Pb1.top + this.Pb1.height + 0.1
  height        := 1
  left          := this.Pb1.left
  width         := this.Pb1.width
  text          := "Fichier : "
  alignVertical := 1
  alignHorizontal := 2
 endwith
*
this.ENTRYFIELD1 = new ENTRYFIELD(this)
 with (this.ENTRYFIELD1)
  top     := this.TEXT1.top
  height  := 1
  left    := this.TEXT1.left + this.TEXT1.width + 1
  width   := form.width - this.ENTRYFIELD1.left
  value   := ""
 endwith
*
this.TEXT2 = new TEXT(this)
 with (this.TEXT2)
  top           := this.TEXT1.top + this.TEXT1.height + 0.1
  height        := 1
  left          := this.TEXT1.left
  width         := this.TEXT1.width
  text          := "Dossier : "
  alignVertical := 1
  alignHorizontal := 2
 endwith
*
this.TEXT3 = new TEXT(this)
 with (this.TEXT3)
  top           := this.TEXT2.top
  height        := 1
  left          := this.TEXT2.left + this.TEXT2.width + 1
  width         := form.width - this.TEXT3.left
  text          := this.Dossier
  alignVertical := 1
 endwith
*
* ------------------------------------------------------------------------------
FUNCTION Ajouter
* ------------------------------------------------------------------------------
*
LockWindowUpdate(form.hWnd)          && Bloquer l'affichage pendant travail.
*
with (form.QUERY1.rowset)
 beginAppend()
 fields["ChampNom"].value   := "C" ;
       + LTRIM(STR(form.QUERY1.rowset.rowCount() + 1, 3, 0))
 fields["ChampType"].value  := "Caractère"
 fields["ChampLong"].value  := 10
 fields["ChampDec"].value   := 0
 save()                              && Pour afficher l'enregistrement.
endwith
*
class::Rafaichit()
*
RETURN null
*
* ------------------------------------------------------------------------------
FUNCTION Creer
* ------------------------------------------------------------------------------
*
IF form.QUERY1.rowset.rowCount() = 0
 MSGBOX("Pas de champ créé, abandon", "Création table", 48)
 form.GRID1.setFocus()
 RETURN null
ENDIF
*
IF EMPTY(form.ENTRYFIELD1.value)
 MSGBOX("Pas de nom de table créé", "Création table", 48)
 form.GRID1.setFocus()
 RETURN null
ENDIF
*
LockWindowUpdate(form.hWnd)          && Bloquer l'affichage pendant travail.
*
LOCAL C, I
*
* Vérification si tout est conforme.
*
form.QUERY1.rowset.first()
DO WHILE .NOT. form.QUERY1.rowset.endOfSet
 *
 * Vérification du nom du champ.
 *
 IF EMPTY(form.QUERY1.rowset.fields["ChampNom"].value)
  MSGBOX("Nom non saisi", "Création de la table", 48)
  class::Rafaichit()
  RETURN null
 ENDIF
 *
 C = LTRIM(RTRIM(form.QUERY1.rowset.fields["ChampNom"].value))
 form.QUERY1.rowset.fields["ChampNom"].value = C
 C = UPPER(C)
 FOR I = 1 TO LEN(C)
  IF .NOT. SUBS(C, I, 1) $ "ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789"
   MSGBOX("Mauvais caractère nom : " + form.QUERY1.rowset.fields["ChampNom"].value ;
         , "Création de la table", 48)
   class::Rafaichit()
   RETURN null
  ENDIF
 ENDFOR
 *
 * Vérification des noms interdits par CREATE TABLE.
 *
 SET EXACT ON
 IF form.Tableau2.scan(C) <> 0

  MSGBOX("Nom de champ interdit : " + form.QUERY1.rowset.fields["ChampNom"].value ;
        , "Création de la table", 48)
  SET EXACT OFF
  class::Rafaichit()
  RETURN null
 ENDIF
 SET EXACT OFF
 *
 form.QUERY1.rowset.next(1)
ENDDO
*
* Vérification si 2 noms de champ identiques.
*
form.QUERY1.rowset.first()
DO WHILE .NOT. form.QUERY1.rowset.endOfSet
 I = form.QUERY1.rowset.rowNo()
 C = RTRIM(UPPER(form.QUERY1.rowset.fields["ChampNom"].value))
 form.QUERY1.rowset.next(1)
 DO WHILE .NOT. form.QUERY1.rowset.endOfSet
  IF C == RTRIM(UPPER(form.QUERY1.rowset.fields["ChampNom"].value))
   MSGBOX("Deux noms identiques : " + form.QUERY1.rowset.fields["ChampNom"].value ;
         , "Création de la table", 48)
   class::Rafaichit()
   RETURN null
  ENDIF
  form.QUERY1.rowset.next(1)
 ENDDO
 form.QUERY1.rowset.goto(I)
 form.QUERY1.rowset.next(1)
ENDDO
*
form.QUERY1.rowset.save()
*
* Mise en forme du nom du fichier et vérification si table existe déjà.
*
form.ENTRYFIELD1.value = LTRIM(RTRIM(form.ENTRYFIELD1.value))
IF UPPER(RIGHT(form.ENTRYFIELD1.value,4)) <> ".DBF"
 form.ENTRYFIELD1.value += ".dbf"
ENDIF
form.TableNom := form.Dossier + "\" + RTRIM(form.ENTRYFIELD1.value)
*
IF _app.databases[1].tableExists(form.TableNom)
 IF MSGBOX("La Table : " + form.TableNom + " existe" + CHR(10) ;
         + "Voulez-vous l'écraser ?", "Création d'une table", 4 + 32) == 7
  class::Rafaichit()
  RETURN null
 ENDIF
 _app.databases[1].dropTable(form.TableNom)
ENDIF
*
* Création de la table.
*
I = 1                                      && Indication table créée.
*
C = 'CREATE TABLE "' + form.TableNom + '" ('
*
form.QUERY1.rowset.first()
DO WHILE .NOT. form.QUERY1.rowset.endOfSet
 *
 DO CASE
 *
 CASE RTRIM(form.QUERY1.rowset.fields["ChampType"].value) == "Caractère"
  C += RTRIM(form.QUERY1.rowset.fields["ChampNom"].value) + " CHAR("
  C += LTRIM(STR(form.QUERY1.rowset.fields["ChampLong"].value, 3, 0)) + '),'
 *
 CASE RTRIM(form.QUERY1.rowset.fields["ChampType"].value) == "Numérique"
  C += RTRIM(form.QUERY1.rowset.fields["ChampNom"].value) + " NUMERIC("
  C += LTRIM(STR(form.QUERY1.rowset.fields["ChampLong"].value, 3, 0)) + ','
  C += LTRIM(STR(form.QUERY1.rowset.fields["ChampDec"].value, 3, 0)) + '),'
 *
 CASE RTRIM(form.QUERY1.rowset.fields["ChampType"].value) == "Date"
  C += RTRIM(form.QUERY1.rowset.fields["ChampNom"].value) + " DATE,"
 *
 CASE RTRIM(form.QUERY1.rowset.fields["ChampType"].value) == "Logique"
  C += RTRIM(form.QUERY1.rowset.fields["ChampNom"].value) + " BOOLEAN,"
 *
 CASE RTRIM(form.QUERY1.rowset.fields["ChampType"].value) == "Logique"
  C += RTRIM(form.QUERY1.rowset.fields["ChampNom"].value) + " BOOLEAN,"
 *
 CASE RTRIM(form.QUERY1.rowset.fields["ChampType"].value) == "Double"
  C += RTRIM(form.QUERY1.rowset.fields["ChampNom"].value) + " FLOAT,"
 *
 CASE RTRIM(form.QUERY1.rowset.fields["ChampType"].value) == "Mémo"
  C += RTRIM(form.QUERY1.rowset.fields["ChampNom"].value) + " BLOB(10,1),"
 *
 CASE RTRIM(form.QUERY1.rowset.fields["ChampType"].value) == "Binaire"
  C += RTRIM(form.QUERY1.rowset.fields["ChampNom"].value) + " BLOB(10,2),"
 *
 CASE RTRIM(form.QUERY1.rowset.fields["ChampType"].value) == "OLE"
  C += RTRIM(form.QUERY1.rowset.fields["ChampNom"].value) + " BLOB(10,4),"
 *
 CASE RTRIM(form.QUERY1.rowset.fields["ChampType"].value) == "Timestamp"
  C += RTRIM(form.QUERY1.rowset.fields["ChampNom"].value) + " TIMESTAMP,"
 *
 CASE RTRIM(form.QUERY1.rowset.fields["ChampType"].value) == "Integrer Long"
  C += RTRIM(form.QUERY1.rowset.fields["ChampNom"].value) + " INT,"
 *
 CASE RTRIM(form.QUERY1.rowset.fields["ChampType"].value) == "AutoIncrement"
  C += RTRIM(form.QUERY1.rowset.fields["ChampNom"].value) + " AUTOINC,"
 *
 OTHERWISE
  MSGBOX("Erreur de programmation type de champ : " ;
        + form.QUERY1.rowset.fields["ChampType"].value ;
        , "Création de la table", 48)
  class::Rafaichit()
  RETURN null
 *
 ENDCASE
 *
 form.QUERY1.rowset.next(1)
ENDDO
*
C = SUBS(C, 1, LEN(C) - 1)                && Enlever la dernière virgule 
C += ')'
*
PRIVATE MACROdbf
MACROdbf = C
TRY
 &MACROdbf
CATCH (Exception e)
 MSGBOX("Nom de la table non conforme ou trop de champs", "Création de la table", 48)
 I = 0
ENDTRY
RELEASE MACROdbf
form.Enregistre := I
*
* Sortie de la forme si appellé par ViewverDbfForm.
*
C = FINDINSTANCE("ViewverDbfForm")
IF .NOT. EMPTY(C)
 LockWindowUpdate(0)
 class::Quitte() 
ENDIF
*
C := null
*
class::Rafaichit()
*
RETURN null
*
* ------------------------------------------------------------------------------
FUNCTION Detruit
* ------------------------------------------------------------------------------
*
TRY
 form.QUERY1.rowset.delete()
CATCH (Exception e)
ENDTRY
*
form.QUERY1.rowset.save()
*
form.GRID1.setFocus()
*
RETURN null
*
* ------------------------------------------------------------------------------
FUNCTION DossierCherche
* ------------------------------------------------------------------------------
*
form.Dossier := GETDIRECTORY()
*
form.TEXT3.text := form.Dossier
*
form.GRID1.setFocus()
*
RETURN null
*
* ------------------------------------------------------------------------------
FUNCTION Field_OnChange
* ------------------------------------------------------------------------------
*
* this concerne form.QUERY1.rowset.fields[" x "]  x = Nom du champ
*
class::QUERY1_Verifie(this.Forme)
*
this.Forme.GRID1.refresh()
*
RETURN null
*
* ------------------------------------------------------------------------------
FUNCTION Form_OnOpen
* ------------------------------------------------------------------------------
*
* Pour bloquerl'affichage pendant le travail.
*
IF TYPE("LockWindowUpdate") <> "FP"
 EXTERN CLOGICAL LockWindowUpdate( CHANDLE ) User32
ENDIF
*
RETURN null
*
* ------------------------------------------------------------------------------
FUNCTION Importer
* ------------------------------------------------------------------------------
*
LOCAL vTable
*
vTable = null
vTable = GETFILE("*.dbf")
*
LockWindowUpdate(form.hWnd)          && Bloquer l'affichage pendant travail.
*
IF .NOT. EMPTY(vTable)
 LOCAL T, I, oTd
 oTd = new TableDef()
 oTd.tablename = vTable
 oTd.load()
 FOR I = 1 TO oTd.fields.size
  *
  T = oTd.fields[I].type
  DO CASE
  CASE T =="CHARACTER"
   T = "Caractère"
  CASE T == "NUMERIC"
   T = "Numérique"
  CASE T == "DATE"
   T = "Date"
  CASE T == "LOGICAL"
   T = "Logique"
  CASE T == "FLOAT"
   T = "Numérique"
  CASE T == "MEMO"
   T = "Mémo"
  CASE T == "BINARY"
   T = "Binaire"
  CASE T == "OLE"
   T = "OLE"
  CASE T == "DATETIME"
   T = "Timestamp"
  CASE T == "LONG"
   T = "Integrer Long"
  CASE T == "AUTOINC"
   T = "AutoIncrement"
  CASE T == "DOUBLE"
   T = "Double"
  ENDCASE
  *
  with (form.QUERY1.rowset)
   beginAppend()
   fields["ChampNom"].value  := oTd.fields[I].fieldname
   fields["ChampType"].value := T
   fields["ChampLong"].value := oTd.fields[I].length
   fields["ChampDec"].value  := oTd.fields[I].decimalLength
  endwith
 ENDFOR
 oTd := null
 *
ENDIF
*
form.QUERY1.rowset.save()           && Pour afficher le dernier enregistrement.
*
class::Rafaichit()
*
RETURN null
*
* ------------------------------------------------------------------------------
FUNCTION QUERY1_Verifie(Forme)
* ------------------------------------------------------------------------------
*
LOCAL ChampType, ChampLong, ChampDec
*
ChampType = RTRIM(Forme.QUERY1.rowset.fields["ChampType"].value)
ChampLong = Forme.QUERY1.rowset.fields["ChampLong"].value
ChampDec  = Forme.QUERY1.rowset.fields["ChampDec"].value
*
IF ChampLong < 1
 Forme.QUERY1.rowset.fields["ChampLong"].value := 1
ENDIF
*
IF ChampDec < 0
 Forme.QUERY1.rowset.fields["ChampDec"].value := 0
ENDIF
*
DO CASE
*
CASE ChampType == "Caractère"
 IF ChampLong > 254
  Forme.QUERY1.rowset.fields["ChampLong"].value := 254
 ENDIF
 IF ChampDec <> 0
  Forme.QUERY1.rowset.fields["ChampDec"].value := 0
 ENDIF
*
CASE ChampType == "Numérique"
 IF ChampLong > 20
  Forme.QUERY1.rowset.fields["ChampLong"].value := 20
 ENDIF
 IF ChampLong < 3
  Forme.QUERY1.rowset.fields["ChampDec"].value := 0
 ELSEIF ChampDec > ChampLong - 2
   Forme.QUERY1.rowset.fields["ChampDec"].value := ;
   ChampLong - 2
 ENDIF
*
CASE ChampType == "Date"
 IF ChampLong <> 8
  Forme.QUERY1.rowset.fields["ChampLong"].value := 8
 ENDIF
 IF ChampDec <> 0
  Forme.QUERY1.rowset.fields["ChampDec"].value := 0
 ENDIF
*
CASE ChampType == "Logique"
 IF ChampLong <> 1
  Forme.QUERY1.rowset.fields["ChampLong"].value := 1
 ENDIF
 IF ChampDec <> 0
  Forme.QUERY1.rowset.fields["ChampDec"].value := 0
 ENDIF
*
CASE ChampType == "Double"
 IF ChampLong <> 8
  Forme.QUERY1.rowset.fields["ChampLong"].value := 8
 ENDIF
 IF ChampDec <> 0
  Forme.QUERY1.rowset.fields["ChampDec"].value := 0
 ENDIF
*
 CASE ChampType == "Mémo"
 IF ChampLong <> 10
  Forme.QUERY1.rowset.fields["ChampLong"].value := 10
 ENDIF
 IF ChampDec <> 1
  Forme.QUERY1.rowset.fields["ChampDec"].value := 1
 ENDIF
*
CASE ChampType == "Binaire"
 IF ChampLong <> 10
  Forme.QUERY1.rowset.fields["ChampLong"].value := 10
 ENDIF
 IF ChampDec <> 2
  Forme.QUERY1.rowset.fields["ChampDec"].value := 2
 ENDIF
*
CASE ChampType == "OLE"
 IF ChampLong <> 10
  Forme.QUERY1.rowset.fields["ChampLong"].value := 10
 ENDIF
 IF ChampDec <> 4
  Forme.QUERY1.rowset.fields["ChampDec"].value := 4
 ENDIF
*
CASE ChampType == "Timestamp"
 IF ChampLong <> 8
  Forme.QUERY1.rowset.fields["ChampLong"].value := 8
 ENDIF
 IF ChampDec <> 0
  Forme.QUERY1.rowset.fields["ChampDec"].value := 0
 ENDIF
*
CASE ChampType == "Integrer Long"
 IF ChampLong <> 4
  Forme.QUERY1.rowset.fields["ChampLong"].value := 4
 ENDIF
 IF ChampDec <> 0
  Forme.QUERY1.rowset.fields["ChampDec"].value := 0
 ENDIF
*
CASE ChampType == "AutoIncrement"
 IF ChampLong <> 4
  Forme.QUERY1.rowset.fields["ChampLong"].value := 4
 ENDIF
 IF ChampDec <> 0
  Forme.QUERY1.rowset.fields["ChampDec"].value := 0
 ENDIF
*
ENDCASE
*
RETURN null
*
* ------------------------------------------------------------------------------
FUNCTION Quitte
* ------------------------------------------------------------------------------
*
IF form.Enregistre == 0
 IF MSGBOX("Abandonner la création en cours", "Table non créée", 4 + 32) == 7
  form.GRID1.setFocus()
  RETURN null
 ENDIF
ENDIF
*
form.QUERY1.active := .F.
*
_app.databases[1].dropTable("0CreeTableInfo35854698.dbf")
*
form.close()
*
RETURN null
*
* ------------------------------------------------------------------------------
FUNCTION Rafaichit
* ------------------------------------------------------------------------------
*
form.GRID1.refresh()
form.GRID1.setFocus()
LockWindowUpdate(0)
*
RETURN null
*
endclass


Fiche fabriquée le : 29/01/11 à 10:22:18